logo

Abstraktní třídy v Pythonu

Abstraktní třídu lze považovat za plán pro ostatní třídy . Umožňuje vám vytvořit sadu metod, které musí být vytvořeny v rámci všech podřízených tříd vytvořených z abstraktní třídy.

Třída, která obsahuje jednu nebo více abstraktních metod, se nazývá an abstraktní třída . An abstraktní metoda je metoda, která má deklaraci, ale nemá implementaci.



Abstraktní třídu používáme, když navrhujeme velké funkční jednotky nebo když chceme poskytnout společné rozhraní pro různé implementace komponenty.

Abstraktní základní třídy v Pythonu

Definováním abstraktní základní třídy můžete definovat společnou Aplikační programové rozhraní (API) pro sadu podtříd. Tato schopnost je užitečná zejména v situacích, kdy třetí strana bude poskytovat implementace, jako jsou pluginy, ale může vám také pomoci při práci ve velkém týmu nebo s velkou kódovou základnou, kde je obtížné udržet všechny třídy ve vaší mysli nebo ne. možný.

rovná se metodě java

Práce na abstraktních třídách Pythonu

Ve výchozím stavu, Krajta neposkytuje abstraktní třídy . Python je dodáván s modulem, který poskytuje základ pro definování A bstract Základní třídy (ABC) a ten název modulu je ABC .



ABC funguje tak, že zdobí metody základní třídy jako abstrakt a poté registruje konkrétní třídy jako implementace abstraktní báze. Metoda se stává abstraktní, když je ozdobena klíčovým slovem @abstractmethod.

Příklad 1:

Tento kód definuje abstraktní základní třídu s názvem Polygon pomocí modulu ABC (Abstract Base Class) v Pythonu. Třída Polygon má nazvanou abstraktní metodu noofsides které je třeba implementovat svými podtřídami.



Jsou definovány čtyři podtřídy Polygonu: Triangle, Pentagon, Hexagon a Quadrilateral. Každá z těchto podtříd přepíše metodu noofsides a poskytuje svou vlastní implementaci tiskem počtu stran, které má.

V kódu ovladače jsou vytvořeny instance každé podtřídy a u každé instance je volána metoda noofsides, která zobrazí počet stran specifických pro daný tvar.

Krajta
# 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ýstup
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

Příklad 2:

Zde tento kód definuje abstraktní základní třídu nazvanou Animal pomocí modulu ABC (Abstract Base Class) v Pythonu. Třída Animal má neabstraktní metodu nazvanou move, která nemá žádnou implementaci. Jsou definovány čtyři podtřídy zvířat: člověk, had, pes a lev. Každá z těchto podtříd přepíše metodu pohybu a poskytuje svou vlastní implementaci vytištěním specifické charakteristiky pohybu.

Krajta
# 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ýstup
I can walk and run I can crawl I can bark I can roar>

Implementace abstraktu prostřednictvím podtřídy

Podtřídou přímo ze základny se můžeme vyhnout nutnosti explicitně registrovat třídu. V tomto případě se k rozpoznání používá správa třídy Python Implementace pluginu jako provádění abstraktní PluginBase .

Krajta
# 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ýstup
True True>

Vedlejším efektem použití přímého podtřídění je, že je možné najít všechny implementace vašeho pluginu dotazem základní třídy na seznam známých tříd z ní odvozených.

Konkrétní metody v abstraktních základních třídách

Konkrétní třídy obsahují pouze konkrétní (normální) metody, zatímco abstraktní třídy mohou obsahovat jak konkrétní metody, tak abstraktní metody.

Konkrétní třída poskytuje implementaci abstraktních metod, abstraktní základní třída může také poskytovat implementaci vyvoláním metod pomocí super(). Podívejme se na příklad pro vyvolání metody pomocí super():

Krajta
# 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ýstup
Abstract Base Class subclass>

Ve výše uvedeném programu můžeme vyvolat metody v abstraktních třídách použitím super().

Abstraktní vlastnosti v Pythonu

Abstraktní třídy zahrnují kromě metod i atributy, atributy můžete vyžadovat v konkrétních třídách jejich definováním pomocí @abstractproperty.

Krajta
# 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ýstup
Can't instantiate abstract class parent with abstract methods geeks child class>

Ve výše uvedeném příkladu nelze vytvořit instanci třídy Base, protože má pouze abstraktní verzi metody property-getter.

Abstraktní třídní instance

Abstraktní třídy jsou neúplné, protože mají metody, které nemají nikoho. Pokud Python umožňuje vytvoření objektu pro abstraktní třídy, pak tento objekt použijte, pokud někdo zavolá abstraktní metodu, ale neexistuje žádná skutečná implementace, kterou by bylo možné vyvolat.

Abstraktní třídu tedy používáme jako šablonu a podle potřeby ji rozšiřujeme a stavíme na ní, než ji můžeme použít. Vzhledem k tomu, že abstraktní třída není konkrétní třídou, nelze ji konkretizovat. Když vytvoříme objekt pro abstraktní třídu to vyvolá chybu .

java bool na řetězec
Krajta
# 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ýstup:

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>