nisfarm.ru

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.tříd pythonu

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ů.metody třídy python

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.

třídy tříd objektů pythonObrá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í:

  1. Instance2;
  2. Třída1;
  3. Class2;
  4. 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ů.atributy třídy python

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.dědičnost třídy pythonů

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říklady tříd pythonu

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.

konstruktor třídy python

__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"]

python vytvořit třídu

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.

Sdílet na sociálních sítích:

Podobné
© 2021 nisfarm.ru