Objektově orientované programování v jazyce Python: Třídy, popis a funkce

Třídy Pythonu jsou základním pojmem. Je základem standardní knihovny, práce nejoblíbenějších programů a samotného jazyka. Pokud se chcete stát více než novým programátorem, musíte pochopit podstatu a princip práce s třídami a objekty.

Jaké jsou třídy

Jedná se o základní programovou součást PLO. V Pythonu se třídy používají k implementaci nových typů objektů a jsou vytvořeny pomocí speciální třídy instrukcí. Zevnitř se podobají standardním vloženým datovým typům, jako jsou čísla nebo sekvence. Ale v objektech třídy existuje významný rozdíl - zachování dědictví.


Objektově orientované programování na Pythonu je zcela založeno na hierarchickém dědictví tříd. Jedná se o univerzální způsob přizpůsobení a opětovného použití kódu. Ale objektově orientovaný přístup není povinný. Python nemá žádný problém umožňující pouze programové a funkční programování. Hlavním úkolem tříd v Pythonu je datový paket a spustitelný kód. Jsou syntakticky podobné výkazu def. Stejně jako funkce vytvářejí své jmenné prostory, které lze opakovaně volat z libovolné části programu. Proč je tedy potřebuje? Třídy jsou silnějším a všestrannějším nástrojem. Většina jejich potenciálu je odhalena v době vzniku nových objektů.

Význam tříd a princip dědění

Každý objekt má svůj vlastní jmenný prostor, který lze naprogramovat, zadat proměnné avytvořte libovolné funkce. Existují také atributy zděděné z objektu class.attribute. To je význam OOP.


Díky dědictví vzniká strom hierarchie. V praxi to je následující. Když se interpret narazí výraz object.attribute, že začne hledat první výskyt zadaného atributu ve třídě. Nepřiřazujeme zjistit, Larry pokračuje hledání všechny související třídy, které jsou ve stromu výše, zleva doprava. Vyhledávací strom obsahuje:
  • superclasses, které jsou na vrcholu hierarchie a implementují obecné chování;
  • podtřídy - jsou níže;
  • kopií - prvky programu s zděděným chováním.
  • Na obrázku je strom tříd Pythonu. Příklad ukazuje, že třídy 2 a 3 jsou superclassy. V dolní části jsou dvě kopie instance 1 a 2 ve střední - třída do třídy 1. Pokud napíšete výraz Instance2.w, bude to dělat tlumočníka vzhled .w hodnotu atributu takto:
  • instance2;
  • třída 1;
  • třída 2;
  • Třída3.
  • Název .w bude nalezen ve třídě nadřazené třídy. Na terminologii OOP to znamená, že instance 2 "dědí" atribut .w Class3. Upozorňujeme, že kopie obrazu zdědí jen čtyři atributy: .w, .x, .y .z:
  • Za kopie Instance1.x a atribut Instance2.x nalezen .x Class 1, kde hledání se zastaví do třídy 1 strom je nižší než třídy 2.
  • Instance1.y a atribut Instance2.y nalezen .y třída 1, kde se vyhledávání zastaví, protože to je jediné místo, kde se objeví.
  • U instancí Instance1.z a Instance2.z bude tlumočník nalezen .z Class 2protože je umístěn ve stromu vlevo než Class3.
  • V případě instance2 se atribut name .name nachází v instanci instance2 bez hledání stromu.
  • Předposlední bod je nejdůležitější. To ukazuje, jak třídy 1 přepíše atribut .x, .x nahrazení nadřazené verzi třídy 2.
    ,

    a metodika kopie

    OOP provozuje dvě hlavní koncepce: Třídy a objekty. Třídy vytvářejí nové typy a objekty třídy v Pythonu jsou jejich instancemi. Například všechny celočíselné proměnné patří typu int. V jazyce OOP jsou to instance třídy int. Třídy jsou vytvářeny instrukcemi a objekty voláním. Mohou ukládat data a mají své vlastní funkce nebo třídní metody. Terminologie hraje v Pythonu důležitou roli. Programátoři s pomocí pomáhají rozlišovat nezávislé funkce od těch, které patří do tříd. Proměnné, které odkazují na objekty, se nazývají pole. V PLO existují dva typy polí. První je proměnná patřící do celé třídy, druhá je proměnná jednotlivých instancí. Políčka a metody společně tvoří atributy třídy. V Pythonu jsou napsány v bloku kódu po třídě klíčových slov.

    Metody a hodnoty samy

    Metody jsou funkce s dalším vlastním jménem. Přidá se na začátek seznamu možností. Pokud chcete, aby proměnná mohla být nazvána jiným jménem, ​​taková iniciativa mezi programátory není vítána. Vlastní je standard, snadno rozpoznatelný v kódovém jménu. Některé vývojové prostředí byly navíc navrženy tak, aby s ním spolupracovaly. Chcete-li lépe porozumět významu sebe v OOP, představte si, že máme třídu s názvem ClassA a methodA:
  • třída ClassA;
  • def metodaA (vlastní, argument1 argument2).
  • objectA objekt je instancí Classa a volání metody takto:
  • objectA.methodA (arg1 arhument2).
  • Když interpret uvidí tento krok, automaticky převádí takto: ClassA.methodA (objectA, argument1 argument2). To znamená, že instance třídy využívá vlastní proměnnou jako odkaz na sebe.

    Jak vytvořit proměnné, metody a instance třídy

    rozebrat nabídne praktický příklad interaktivní shell Python. Vytvoření třídu "ЭksperymentPervыy" začíná instrukce třídy komponent:
  • třída ЭksperymentPervыy
  • def setinf (self, hodnota): # vytvořit první metodu s argumenty
  • self.data = hodnoty [41 ]
  • def zobrazení (self): # druhá metoda
  • tisk (self.data) # tisknout kopie dat.
  • Po ústupu by mělo být povinné jednotka s připojenými pokyny def, který představuje objekty jsou přiřazeny názvy a setinf displej. S jejich pomocí jsou vytvořeny atributy ExperimentPrivy.setinf a ExperimentPrivy.display. Ve skutečnosti se jakýkoli název, který přiřadí hodnotu do nejvyšší úrovně ve vnořeném bloku, stává atribut. Chcete-li zjistit, jak metody pracují, musíte vytvořit dvě instance:
  • x = Experiment First () # Dvě kopie jsou vytvořeny;
  • y = ExperimentPerfect () # Každý je samostatný obor názvů.
  • Nejprve vzorky neukládají žádné informace a jsou zcela prázdné. Ale oni jsou příbuzní s jejich třídou:
  • x.setinf ("Teach Python") # Zavolejte metodu, ve které self-x.
  • y.setinf (314) # Ekvivalentní: ЭksperymentPervыy.setinf (y, 314)
  • Je-li ve jménu kopiíx, y platí pro atribut třídy objektu .setinf ЭksperymentPervыy, při hledání dědické dřevo tlumočníka vrátí atribut třídy.
  • x.display () # na hodnoty X a Y jejich self.data
  • učení Python
  • y.display ()
  • , 314.
  • (52 )

    Operátory s přetížením

    V Pythonu mohou třídy překročit zatížení operátorů. Tato možnost vytváří kopie podobné vestavěným datovým typům. Proces je implementovat metody se speciálními názvy, které začínají a končí dvojitým podtržením. Zvažte v akci __init__ a __sub__. První metoda se nazývá konstruktor třídy. V nástroji Python __init__ provádí operaci vytváření kopie. Druhá metoda __sub__ provádí operaci odčítání.
  • Třída přetížení: # vytvořit novou třídu
  • def __init __ (self, spuštění):
  • self.data = start
  • def __sub __ (self, jiné): # mínus další kopie
  • vratné přetížení (self.data - ostatní) # výsledkem bude nová instance
  • A = přetížení

    #__ init __ (A, 10)

  • B = A - 2 #__ sub __ (B, 2)
  • B. údaje #B - nová instance přetížení
  • 8.
  • Detaily metodu __init__

    Způsob __init__ nejčastěji používaná při práci s třídami. Je nepostradatelná pro inicializaci různých objektů. __init__ volání odděleně. Při vytváření nové instance metoda automaticky přijímá argumenty uvedené v závorkách. Pomocí metod přetížení lze provádět jakoukoli operaci s vloženými datovými typy. Většina z nich se používá pouze při řešení zvláštních úkolů, při nichž je třeba objektysimulace chování standardních objektů. Metody jsou zděděny z superclassů a nejsou povinné. V počátečních fázích je snadné bez nich. Ale pro úplné ponoření do programování a podstaty PLO potřebujete dovednosti práce s operátory.

    Způsob __getitem__

    Způsob provádí přetížení __getitem__ přístupový prvek indexu. Pokud by se dědí nebo přítomné v definici třídy, pak je indexována každá transakce interpreter ho automaticky zavolá. Například, když se objeví kopie F v extrakční prvku exprese s indexem, jako je f [i], Python interpret je __getitem__ metoda, objekt F míjí první argument index uvedený v závorkách v druhém. Další třída "PrymerYndeksatsyy" vrátí čtverec indexu:
  • , třída PrymerYndeksatsyy
  • def __getitem __ (self, index):
  • vratné index ** 2
  • F = PrymerYndeksatsyy ()
  • F
  • # exprese f [i] je F .__ GetItem __ (i)
  • 4
  • , pro i v rozsahu
  • print (F [i] end = «») # je __getitem __ (F, i) v každé iteraci
  • 014 916
  • Při použití této metody, můžete provést operaci extrakci střih, který je často používán při práci se sekvencemi. Při zpracování seznamu standardních transakcí syntaxe je následující:
  • Registr = [13, 6, "a", "c", 74,9]
  • Seznam [2: 4]
  • ["a", "c"]
  • Seznam [1:]
  • [6, "a", "c", 74,9]
  • Registr [: -1]
  • [13, 6, "a", "c"]
  • Seznam [:: 2]
  • [13 "a" 74,9 ]
  • třída, která implementuje metodu __getitem__:
  • Indexer třída
  • moy_spysok = [13, 6, "a", "c", 74,9]
  • def __getitem__ (vlastní, index): # Voláno kdyindexování nebo výpis plátek
  • print («GetItem:», index)
  • return self.moy_spysok [index] # Provede výtažky indexování nebo snížit
  • X = Indexer ()
  • X# Při indexování __getitem__ přijímá celé číslo
  • GetItem: 0
  • , 13
  • X [2: 4] # Při těžbě řez __getitem__ dostane řez objekt
  • getItem: plátek (duben 2 Žádný)
  • ["a", "c"]
  • Odvolání k atributům

    Speciální metoda __getattr__ se používá k odkazování na atribut. Označuje se názvem atributu ve tvaru řádku v případě zjištění pokusu o odkaz na neexistující nebo neurčitý atribut. Když tlumočník dokáže detekovat požadovaný objekt ve stromu dědičnosti, __getattr __. Není volán. Metoda je vhodná pro všeobecný zpracování požadavků na atributy:
  • , třída Gone:
  • def __getattr __ (self, atname):
  • , pokud atname == «věku»:
  • návrat 20
  • dále:
  • zvyšuje, AttributeError atname
  • , D = uplynulý ()
  • D. věk
  • 20
  • D. jméno
  • AttributeError: name
  • Třída pryč a její kopie D nemají žádné atributy. Proto při volání do věku D. se automaticky volá metoda __getattr__. Samotná kopie se přenáší jako já a jméno neurčitého "věku" v řádku atname. Třída vrátí výsledek zásahu do názvu D. věku, přestože tento atribut nemá. Pokud se neočekává, že atribut class způsob zpracování __getattr__ je zapuštěn výjimku, a tím i interpret předává informace, že název ve skutečnosti je nejistá. V tomto případě pokus o odkaz na jméno D. vede k chybě. Metoda funguje podobným způsobemPřetížení operátorů __setattr__, zachycování každého pokusu o přiřazení hodnot atributů. Pokud je tato metoda zapsána v těle třídy, výraz "self.attitude = value" bude převeden na volání metody self .__ setattr _ ("atribut", hodnota). Popisovali jsme jen několik existujících metod přetížení. Celý seznam je ve standardním průvodce jazykem a obsahuje mnoho dalších jmen.

    Další funkce

    OOP se někdy používají pro komplexní a nestandardní úkoly. Díky dědění tříd v jazyce Python je chování integrovaných datových typů a jejich schopností rozšířeno a přizpůsobeno. Pokud nejste spokojeni se skutečností, že indexování v sekvencích začíná od začátku, můžete ji opravit pomocí instrukcí třídy. Chcete-li to provést, musíte vytvořit podtřídu seznamu typů s novými názvy všech typů a provést potřebné změny. Také v PLO v jazyku Python existují dekodéry funkcí, statické metody a mnoho dalších složitých a speciálních technik.

    Související publikace