logo

Abstraktné triedy v Pythone

Abstraktnú triedu možno považovať za plán pre ostatných triedy . Umožňuje vám vytvoriť množinu metód, ktoré musia byť vytvorené v rámci akýchkoľvek podradených tried vytvorených z abstraktnej triedy.

Trieda, ktorá obsahuje jednu alebo viac abstraktných metód, sa nazýva an abstraktná trieda . An abstraktná metóda je metóda, ktorá má deklaráciu, ale nemá implementáciu.



Abstraktnú triedu používame, keď navrhujeme veľké funkčné jednotky alebo keď chceme poskytnúť spoločné rozhranie pre rôzne implementácie komponentu.

Abstraktné základné triedy v Pythone

Definovaním abstraktnej základnej triedy môžete definovať spoločnú Aplikačné programové rozhranie (API) pre množinu podtried. Táto funkcia je užitočná najmä v situáciách, keď sa tretia strana chystá poskytnúť implementácie, napríklad s pluginmi, ale môže vám pomôcť aj pri práci vo veľkom tíme alebo s veľkou kódovou základňou, kde je ťažké udržať všetky triedy vo vašej mysli alebo nie. možné.

výlet ale

Práca na abstraktných triedach Pythonu

Predvolene, Python neposkytuje abstraktné triedy . Python prichádza s modulom, ktorý poskytuje základ pre definovanie A bstract Základné triedy (ABC) a ten názov modulu je ABC .



ABC funguje tak, že metódy základnej triedy vyzdobí ako abstrakt a potom zaregistruje konkrétne triedy ako implementácie abstraktnej bázy. Metóda sa stáva abstraktnou, keď je ozdobená kľúčovým slovom @abstractmethod.

Príklad 1:

Tento kód definuje abstraktnú základnú triedu tzv Polygón pomocou modulu ABC (Abstract Base Class) v Pythone. Trieda Polygon má abstraktnú metódu tzv noofsides ktoré musia byť implementované svojimi podtriedami.



mapa vs

Existujú štyri podtriedy polygónu: trojuholník, päťuholník, šesťuholník a štvoruholník. Každá z týchto podtried má prednosť pred metódou noofsides a poskytuje svoju vlastnú implementáciu vytlačením počtu strán, ktoré má.

V kóde ovládača sa vytvoria inštancie každej podtriedy a pri každej inštancii sa zavolá metóda noofsides, aby sa zobrazil počet strán špecifických pre daný tvar.

Python
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Polygon(ABC): @abstractmethod def noofsides(self): pass class Triangle(Polygon): # overriding abstract method def noofsides(self): print('I have 3 sides') class Pentagon(Polygon): # overriding abstract method def noofsides(self): print('I have 5 sides') class Hexagon(Polygon): # overriding abstract method def noofsides(self): print('I have 6 sides') class Quadrilateral(Polygon): # overriding abstract method def noofsides(self): print('I have 4 sides') # Driver code R = Triangle() R.noofsides() K = Quadrilateral() K.noofsides() R = Pentagon() R.noofsides() K = Hexagon() K.noofsides()>

Výkon
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

Príklad 2:

Tento kód tu definuje abstraktnú základnú triedu s názvom Animal pomocou modulu ABC (Abstract Base Class) v Pythone. Trieda Animal má neabstraktnú metódu s názvom move, ktorá nemá žiadnu implementáciu. Existujú štyri podtriedy zvierat: človek, had, pes a lev. Každá z týchto podtried má prednosť pred metódou pohybu a poskytuje svoju vlastnú implementáciu vytlačením špecifickej charakteristiky pohybu.

binárny strom inorder traversal
Python
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Animal(ABC): def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') # Driver code R = Human() R.move() K = Snake() K.move() R = Dog() R.move() K = Lion() K.move()>

Výkon
I can walk and run I can crawl I can bark I can roar>

Implementácia abstraktu prostredníctvom podtriedy

Podtriedou priamo zo základne sa môžeme vyhnúť potrebe explicitne registrovať triedu. V tomto prípade sa na rozpoznanie používa správa triedy Python Implementácia pluginu ako implementácia abstraktný PluginBase .

Python
# Python program showing # implementation of abstract # class through subclassing import abc class parent: def geeks(self): pass class child(parent): def geeks(self): print('child class') # Driver code print( issubclass(child, parent)) print( isinstance(child(), parent))>

Výkon
True True>

Vedľajším efektom použitia priamej podtriedy je, že je možné nájsť všetky implementácie vášho pluginu tak, že požiadate základnú triedu o zoznam známych tried z nej odvodených.

Konkrétne metódy v abstraktných základných triedach

Konkrétne triedy obsahujú iba konkrétne (normálne) metódy, zatiaľ čo abstraktné triedy môžu obsahovať konkrétne metódy aj abstraktné metódy.

Konkrétna trieda poskytuje implementáciu abstraktných metód, abstraktná základná trieda môže tiež poskytnúť implementáciu vyvolaním metód cez super(). Pozrime sa na príklad na vyvolanie metódy pomocou super():

Python
# Python program invoking a  # method using super() from abc import ABC class R(ABC): def rk(self): print('Abstract Base Class') class K(R): def rk(self): super().rk() print('subclass ') # Driver code r = K() r.rk()>

Výkon
Abstract Base Class subclass>

Vo vyššie uvedenom programe môžeme vyvolať metódy v abstraktných triedach použitím Super().

Abstraktné vlastnosti v Pythone

Abstraktné triedy obsahujú okrem metód aj atribúty, atribúty môžete vyžadovať v konkrétnych triedach tak, že ich zadefinujete pomocou @abstractproperty.

typ v jazyku Java
Python
# Python program showing # abstract properties import abc from abc import ABC, abstractmethod class parent(ABC): @abc.abstractproperty def geeks(self): return 'parent class' class child(parent): @property def geeks(self): return 'child class' try: r = parent() print(r.geeks) except Exception as err: print(err) r = child() print(r.geeks)>

Výkon
Can't instantiate abstract class parent with abstract methods geeks child class>

Vo vyššie uvedenom príklade nie je možné vytvoriť inštanciu triedy Base, pretože má iba abstraktnú verziu metódy získavania vlastností.

Inštancia abstraktnej triedy

Abstraktné triedy sú neúplné, pretože majú metódy, ktoré nemajú nikoho. Ak Python umožňuje vytvorenie objektu pre abstraktné triedy, potom tento objekt použite, ak niekto zavolá abstraktnú metódu, ale neexistuje žiadna skutočná implementácia, ktorú by bolo možné vyvolať.

Takže používame abstraktnú triedu ako šablónu a podľa potreby ju rozširujeme a staviame na nej, než ju môžeme použiť. Vzhľadom na to, že abstraktná trieda nie je konkrétna trieda, nemôže byť inštanciovaná. Keď vytvoríme objekt pre abstraktnú triedu to vyvoláva chybu .

Python
# Python program showing # abstract class cannot # be an instantiation from abc import ABC,abstractmethod class Animal(ABC): @abstractmethod def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') c=Animal()>

Výkon:

Traceback (most recent call last): File '/home/ffe4267d930f204512b7f501bb1bc489.py', line 19, in c=Animal() TypeError: Can't instantiate abstract class Animal with abstract methods move>