logo

Abstrakta klasser i Python

En abstrakt klass kan betraktas som en plan för andra klasser . Det låter dig skapa en uppsättning metoder som måste skapas inom alla underordnade klasser byggda från den abstrakta klassen.

En klass som innehåller en eller flera abstrakta metoder kallas an abstrakt klass . En abstrakt metod är en metod som har en deklaration men inte har en implementering.



Vi använder en abstrakt klass när vi designar stora funktionella enheter eller när vi vill tillhandahålla ett gemensamt gränssnitt för olika implementeringar av en komponent.

skillnaden mellan array och arraylist

Abstrakta basklasser i Python

Genom att definiera en abstrakt basklass kan du definiera en gemensam Application Program Interface (API) för en uppsättning underklasser. Denna förmåga är särskilt användbar i situationer där en tredje part kommer att tillhandahålla implementeringar, till exempel med plugins, men kan också hjälpa dig när du arbetar i ett stort team eller med en stor kodbas där det är svårt eller inte att hålla alla klasser i ditt sinne. möjlig.

Arbetar med Python Abstrakt klasser

Som standard, Pytonorm ger inte abstrakta klasser . Python kommer med en modul som ger basen för att definiera A bstract Basklasser (ABC) och det modulnamnet är ABC .



ABC fungerar genom att dekorera basklassens metoder som ett abstrakt och sedan registrera konkreta klasser som implementeringar av den abstrakta basen. En metod blir abstrakt när den dekoreras med sökordet @abstractmethod.

Exempel 1:

Denna kod definierar en abstrakt basklass som kallas Polygon med ABC-modulen (Abstract Base Class) i Python. Polygonklassen har en abstrakt metod som kallas noofsides som måste implementeras av dess underklasser.



Det finns fyra underklasser av polygon definierade: Triangel, Pentagon, Hexagon och Quadrilateral. Var och en av dessa underklasser åsidosätter noofsides-metoden och tillhandahåller sin egen implementering genom att skriva ut antalet sidor den har.

I drivrutinskoden skapas instanser av varje underklass, och noofsides-metoden anropas på varje instans för att visa antalet sidor som är specifika för den formen.

Pytonorm
# 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()>

Produktion
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

Exempel 2:

Här definierar den här koden en abstrakt basklass som kallas Animal med ABC-modulen (Abstract Base Class) i Python. Animal-klassen har en icke-abstrakt metod som kallas move som inte har någon implementering. Det finns fyra underklasser av Djur definierade: människa, orm, hund och lejon. Var och en av dessa underklasser åsidosätter rörelsemetoden och tillhandahåller sin egen implementering genom att skriva ut en specifik rörelsekarakteristik.

Pytonorm
# 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()>

Produktion
I can walk and run I can crawl I can bark I can roar>

Implementering av abstrakt genom underklass

Genom att underklassa direkt från basen kan vi undvika behovet av att registrera klassen explicit. I det här fallet används Python-klasshanteringen för att känna igen Implementering av plugin som att genomföra abstrakt PluginBase .

Pytonorm
# 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))>

Produktion
True True>

En bieffekt av att använda direkt underklassning är att det är möjligt att hitta alla implementeringar av din plugin genom att be basklassen om listan över kända klasser som härrör från den.

Konkreta metoder i abstrakta basklasser

Konkreta klasser innehåller bara konkreta (normala) metoder medan abstrakta klasser kan innehålla både konkreta metoder och abstrakta metoder.

Den konkreta klassen ger en implementering av abstrakta metoder, den abstrakta basklassen kan också tillhandahålla en implementering genom att anropa metoderna via super(). Låt oss titta över exemplet för att anropa metoden med super():

Pytonorm
# 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()>

Produktion
Abstract Base Class subclass>

I programmet ovan kan vi anropa metoderna i abstrakta klasser genom att använda super().

Abstrakta egenskaper i Python

Abstrakta klasser inkluderar attribut förutom metoder, du kan kräva attributen i konkreta klasser genom att definiera dem med @abstractproperty.

Pytonorm
# 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)>

Produktion
Can't instantiate abstract class parent with abstract methods geeks child class>

I exemplet ovan kan Base-klassen inte instansieras eftersom den bara har en abstrakt version av egenskaps-getter-metoden.

Abstrakt klassinstansiering

Abstrakta klasser är ofullständiga eftersom de har metoder som inte har någon. Om Python tillåter att skapa ett objekt för abstrakta klasser, använd det objektet om någon anropar den abstrakta metoden, men det finns ingen faktisk implementering att anropa.

hur man laddar ner musik

Så vi använder en abstrakt klass som mall och efter behov utökar vi den och bygger vidare på den innan vi kan använda den. På grund av det faktum att en abstrakt klass inte är en konkret klass, den kan inte instansieras. När vi skapar ett objekt för den abstrakta klassen det ger upphov till ett fel .

Pytonorm
# 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()>

Produktion:

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>