Objektově orientované programování v Pythonu: třídy, popis a funkce
V Pythonu jsou třídy základním pojetím. To je základ standardní knihovny, práce nejoblíbenějších programů a samotného jazyka. Pokud se chcete stát více než jen začátečník programátor, musíte pochopit podstatu a princip práce s třídami a objekty.
Obsah
Co jsou třídy
Toto je základní softwarová součást OOP. V jazyce Python se třídy používají k implementaci nových typů objektů a jsou vytvářeny pomocí speciálních instrukcí třídy. Venku se podobají standardním vestavěným datovým typům, jako jsou čísla nebo sekvence. Ale objekty třídy mají významný rozdíl - podpora dědictví.
Objektově orientované programování v Pythonu je zcela založen 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 umožňuje bezproblémové procedurální a funkční programování.
Hlavním úkolem tříd v Pythonu je balení dat a spustitelného kódu. Syntakticky jsou stejné jako instrukce def. Stejně jako funkce vytvářejí vlastní jmenné prostory, které lze opakovaně volat z libovolné části programu. Tak proč jsou potřebné? Třídy jsou silnějším a všestrannějším nástrojem. Většinou je jejich potenciál odhalen při vytváření nových objektů.
Význam tříd a princip dědictví
Každý nový objekt má svůj vlastní jmenný prostor, který můžete naprogramovat, zadávat proměnné a vytvářet libovolné funkce. A také jsou atributy zděděné z třídy: object.attribute. To je význam OOP.
Díky dědění je vytvořen hierarchický strom. V praxi to vypadá takto. Když se tlumočník setká s výrazem object.attribute, začne hledat první výskyt atributu ve určené třídě. Bez zjištění atributu tlumočník pokračuje ve vyhledávání ve všech souvisejících třídách ve stromu výše, zleva doprava.
Vyhledávací strom obsahuje:
- Superclasses, které jsou na samém vrcholu hierarchie a implementují běžné chování;
- podtřídy - jsou níže;
- instance jsou prvky programu s dědičným chováním.
Obrázek znázorňuje Python třídy strom. Tento příklad ukazuje, že třídy 2 a 3 - je nadtříd. V dolní části jsou dvě kopie stupně 1 a 2, ve středu - podtřídou třídy 1. Pokud napíšete výraz Instance2.w, bude to způsobí, že překladač hledat .w hodnotu atributu v následujícím pořadí:
- Instance2;
- Třída1;
- Class2;
- Class3.
Název .w se nalézá v nadřazené třídě Class3. V terminologii OOP to znamená, že instance 2 "dědí" atribut .w z Class3.
Všimněte si, že instance na obrázku dědí pouze čtyři atributy: .w, .x, .y a .z:
- Například Instance1.x a Instance2.x .x atribut se nachází ve třídě 1, kde se vyhledávání zastaví, protože třída 1 je v dolní větvi než třídu 2.
- Pro Instance1.y a Instance2.y .y atributu se nachází ve třídě 1, kde se vyhledávání zastaví, protože to je jediné místo, kde se objeví.
- Pro instance Instance1.z a Instance2.z nalezne tlumočník .z ve třídě 2, protože je umístěn ve stromu nalevo od třídy 3.
- V případě instance2.name bude atribut .name nalezen v instanci instance2 bez hledání stromu.
Předposlední položka je nejdůležitější. Ukazuje, jak třída 1 přepíše atribut .x, nahrazující verzi .x třídy nadřazené třídy.
Objekty, instance a metody
OOP pracuje se dvěma hlavními pojmy: 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é se vztahují k integrovanému datovému typu int. V jazyce OOP jsou to instance třídy int.
Třídy jsou vytvářeny instrukcemi a objekty jsou vytvářeny pomocí hovorů. Mohou ukládat data a mají vlastní funkčnost nebo třídní metody. V Pythonu hraje důležitou roli terminologie. Programátoři s pomocí pomáhají rozlišovat nezávislé funkce od těch, které patří do tříd. Proměnné související s objekty se nazývají pole.
V OOP existují dva typy polí. První je proměnné patřící do celé třídy, druhá proměnné jednotlivých instancí. Políčka a metody společně tvoří atributy třídy. V Pythonu jsou po třídě klíčových slov zapsány do bloku kódů.
Metody a význam sebe sama
Metody jsou funkce s doplňujícím jménem. Přidává se na začátek seznamu parametrů. V případě potřeby lze proměnnou nazvat jiný název, ale taková iniciativa mezi programátory není vítána. Self je standardní, snadno rozpoznatelné jméno v kódu. Některé vývojové prostředí jsou navíc navrženy pro práci s nimi.
Chcete-li lépe porozumět hodnotě sebe sama v OOP, představte si, že máme třídu nazvanou ClassA a methodA:
- > třída ClassA;
- def metodaA (vlastní, argument1, argument2).
ObjektA je instancí ClassA a volání metody vypadá takto:
- > objectA.methodA (argument1, argument2).
Když interpret vidí tento řádek, automaticky jej převede takto: ClassA.methodA (objectA, argument1, argument2). To znamená, že instance třídy používá proměnnou sebe jako odkaz na sebe.
Jak vytvořit proměnné, metody a instance tříd
Nabízíme demontáž praktického příkladu z interaktivní shell Pythonu. Vytvoření třídy "Experiment First" začíná třídou příkazových příkazů:
- > třída Experiment první:
- def setinf (vlastní, hodnota): # vytvořte první metodu s argumenty
- self.data = hodnota
- def zobrazení (self): # druhá metoda
- print (self.data) # vytiskněte data instance.
Po povinném odsazení se následuje blok se vnořenými instrukcemi def, ve kterém jsou dvěma objektům přiřazeny názvy a zobrazení. S jejich pomocí jsou vytvořeny atributy Experiment First.setinf a Experiment First.display. Ve skutečnosti, jakýkoli název, který je přiřazen hodnotě na nejvyšší úrovni ve vnořeném bloku, se stává atribut.
Chcete-li zjistit, jak metody pracují, musíte vytvořit dvě instance:
- > x = Experiment First () # Vytvořeny jsou dva instance;
- > y = Experiment First () # Každý je samostatný obor názvů.
Zpočátku instance neukládají žádné informace a jsou zcela prázdné. Ale souvisí s jejich třídou:
- > x.setinf ("Learning Python") # Volání metody, ve které je samo x.
- > y.setinf (3.14) # Ekvivalent: Experiment First.setinf (y, 3.14)
Pokud se za názvem instance x, y odkazují na atribut .setinf třídy EksperimentPervy objektu, výsledná dědičnost vyhledávací strom interpreter vrací hodnotu atributu třídy.
- > x.display () # x a y mají své vlastní hodnoty self.data
- Naučte se Python
- > y.display ()
- 3.14.
Přetížení obsluhy
V Pythonu mohou třídy přetížit výrazové výrazy. Tato možnost umožňuje, aby instance byly podobné vestavěným datovým typům. Proces se skládá z metod implementace se speciálními názvy, které začínají a končí dvojitým podtržítkem.
Zvažte v akci __init__ a __sub__. První metoda se nazývá konstruktor třídy. V souboru Python provádí __init__ přetížení při vytváření instance. Druhá metoda __sub__ provádí operaci odčítání.
- > třída přetížení: # vytvoří novou třídu
- def __init __ (vlastní, start):
- self.data = start
- def __sub __ (vlastní, jiné): # instance minus jiné
- Zpětné přetížení (self.data - other) # Výsledkem je nová instance
- > A = přetížení (10) #__ init __ (A, 10)
- > B = A - 2 #__ sub __ (B, 2)
- > B.data # B je nová instance třídy přetížení
- 8.
Další informace o metodě __init__
Metoda __init__ se nejčastěji používá při práci s třídami. Je nepostradatelná pro inicializaci různých objektů. __init__ nemusí být voláno zvlášť. Když je vytvořena nová instance, metoda automaticky přijímá argumenty uvedené v závorce.
Pomocí metod přetížení můžete provádět jakékoli operace s vestavěnými datovými typy. Většina z nich se používá pouze při řešení zvláštních úkolů, při kterých je nutné, aby objekty napodobovaly chování standardních objektů.
Metody jsou zděděny z nadřazených tříd a nejsou povinné. V počátečních fázích můžete bez nich snadno udělat. Ale pro úplné ponoření do programování a podstaty OOP, musíte pracovat s operátory.
__getitem__ metoda
__getitem__ metoda provádí přístup přetížení na index prvku. Pokud to je dědičná nebo je přítomen v definici třídy, bude překladač automaticky říkat pokaždé, když indexování operace. Například, když instance prvku F se objeví v vyhledávacích index podmínek, jako je například f [i], Python interpret volá __getitem__ metodu, objekt F prochází v prvním argumentu a index uvedené v hranaté závorky, ve druhém.
Následující třída "Indexovací index" vrátí čtverec hodnoty indexu:
- > třída SampleIndexation:
- def __getitem __ (vlastní, index):
- návratový index ** 2
- > F = Příklad indexování ()
- > F [2] # Výraz F [i] volá F .__ getitem __ (i)
- 4
- > pro i v dosahu (5):
- print (F [i], end = "") # Volání __getitem __ (F, i) v každé iteraci
- 0 1 4 9 16
Stejným způsobem můžete provést operaci extrakce řezu, která se často používá při práci s sekvencemi. Při zpracování seznamů je standardní syntaxe operace následující:
- > Seznam = [13, 6, «a», «s», 74,9]
- > Seznam [2: 4]
- ["A", "c"]
- > Seznam [1:]
- [6, "a", "c", 74,9]
- > Seznam [: - 1]
- [13, 6, "a", "c"]
- > Seznam [:: 2]
- [13, "a", 74,9]
Třída, která implementuje metodu __getitem__:
- > třídní index:
- my_list = [13, 6, «a», «s», 74,9]
- def __getitem __ (vlastní, index): # Voláno při indexování nebo extrahování řezu
- tisk ("getitem:", index)
- návrat self.my seznam [index] # Provede indexování nebo extrahuje plátek
- > X = Indexér ()
- > X [0] # Při indexování získá __getitem__ celé číslo
- getitem: 0
- 13. místo
- > X [2: 4] # Při extrakci řezu __getitem__ obdrží objekt řezu
- getitem: řez (2, 4, žádný)
- ["A", "c"]
Atribut přistupuje
Chcete-li získat odkaz na atribut, použijte speciální metodu __getattr__. Označuje se názvem atributu ve formě řetězce v případě zjištění pokusu o získání odkazu na neexistující nebo nedefinovaný atribut. Když tlumočník nalezne 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řídy Gone:
- def __getattr __ (vlastní, jméno):
- jestliže atname == "věk":
- návrat 20
- jinak:
- zvýšit AttributeError, atname
- > D = Gone ()
- > D.age
- 20
- > D. název
- AtributError: jméno
Třída Gone a její instance D nemají vlastní atributy. Proto při přístupu ke službě D.age se automaticky volá metoda __getattr__. Samotná instance je předána jako já, ale jméno nedefinovaného "věku" v řetězci atname. Třída vrátí výsledek přístupu k názvu D.age, přestože tento atribut nemá.
Je-li atribut třída není léčeno, __getattr__ volání metody vestavěný výjimky, a tím přenáší informace do interpretu, že název je ve skutečnosti nejisté. V tomto případě se pokusíte o přístup k názvu D. název způsobí chybu.
Metoda přetěžování operátoru __setattr__ pracuje podobným způsobem a zachycuje každý pokus o přiřazení hodnoty atributu. Pokud je tato metoda registrována v těle třídy, výraz "self.attribute = hodnota" 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žívá pro složité a nestandardní úkoly. Tím, že dědí třídy v Pythonu, chování vestavěných datových typů a jejich schopností je přizpůsobitelné rozšíření a přizpůsobení.
Pokud nejste spokojeni se skutečností, že indexování v sekvencích začíná od začátku, můžete to opravit pomocí příkazu třídy. Chcete-li to provést, vytvořte podtřídu seznamu typů s novými názvy všech typů a proveďte potřebné změny. Také v OOP v Pythonu existují funkční dekoratéři, statické metody a mnoho dalších složitých a speciálních technik.
- Objektově orientované programování
- Python je vývojové prostředí. Python 3 pro začátečníky
- Co je Ruby? Programovací jazyk `Ruby`
- Zapouzdření je co? Zapouzdření v programování
- Python pro začátečníky
- OOP je co? Základní principy objektově orientovaného programování
- Programování her: programy, funkce tvorby a doporučení
- PHP konstrukce: vytváření instancí tříd
- Skriptovací programovací jazyky: úkoly, funkce a výhody
- Procedurální programování je co?
- Programování v Pythonu: Seznam
- Vstup a výstup v Pythonu. Vstup a tisk
- Programování v Pythonu. Práce s řetězci
- Jak najdu zbytek dělení v Pythonu?
- Podmíněná konstrukce if. Python: rozlehlost a jednoduchost jazyka
- Python: datové typy, podmínky, požadavky a příklady
- Funkce v Pythonu: def. Python 3 pro začátečníky
- Co jsou objekty str v Pythonu?
- Práce s objekty souborů: otevřete, přečtěte a zapisujte soubory do Pythonu
- Podmíněné příkazy if / else v jazyce Python: syntaxe a aplikace
- Standardní knihovny C ++