En abstrakt klasse kan betraktes som en blåkopi for andre klasser . Den lar deg lage et sett med metoder som må opprettes i alle barneklasser bygget fra den abstrakte klassen.
En klasse som inneholder en eller flere abstrakte metoder kalles en abstrakt klasse . An abstrakt metode er en metode som har en erklæring, men som ikke har en implementering.
Vi bruker en abstrakt klasse mens vi designer store funksjonelle enheter eller når vi ønsker å gi et felles grensesnitt for ulike implementeringer av en komponent.
Abstrakte grunnklasser i Python
Ved å definere en abstrakt basisklasse kan du definere en felles Application Program Interface (API) for et sett med underklasser. Denne funksjonen er spesielt nyttig i situasjoner der en tredjepart skal tilby implementeringer, for eksempel med plugins, men kan også hjelpe deg når du jobber i et stort team eller med en stor kodebase der det er vanskelig eller ikke å holde alle klasser i tankene. mulig.
Jobber med Python Abstrakt-klasser
Som standard, Python gir ikke abstrakte klasser . Python kommer med en modul som gir grunnlaget for å definere A bstract Base Classes (ABC) og det modulnavnet er ABC .
ABC fungerer ved å dekorere metoder for basisklassen som et abstrakt og deretter registrere konkrete klasser som implementeringer av den abstrakte basen. En metode blir abstrakt når den dekoreres med søkeordet @abstractmethod.
Eksempel 1:
Denne koden definerer en abstrakt baseklasse kalt Polygon ved å bruke ABC-modulen (Abstract Base Class) i Python. Polygon-klassen har en abstrakt metode kalt noofsides som må implementeres av underklassene.
Det er fire underklasser av polygon definert: trekant, femkant, sekskant og firkant. Hver av disse underklassene overstyrer noofsides-metoden og gir sin egen implementering ved å skrive ut antall sider den har.
I driverkoden opprettes forekomster av hver underklasse, og noofsides-metoden kalles på hver forekomst for å vise antall sider som er spesifikke for den formen.
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()> Produksjon
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>
Eksempel 2:
Her definerer denne koden en abstrakt baseklasse kalt Animal ved å bruke ABC (Abstract Base Class)-modulen i Python. Animal-klassen har en ikke-abstrakt metode kalt move som ikke har noen implementering. Det er fire underklasser av Dyr definert: Menneske, Slange, Hund og Løve. Hver av disse underklassene overstyrer bevegelsesmetoden og gir sin egen implementering ved å skrive ut en spesifikk bevegelseskarakteristikk.
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()> Produksjon
I can walk and run I can crawl I can bark I can roar>
Implementering av abstrakt gjennom underklasse
Ved å underklassere direkte fra basen kan vi unngå behovet for å registrere klassen eksplisitt. I dette tilfellet brukes Python-klasseadministrasjonen til å gjenkjenne Implementering av plugin som implementering av abstrakt 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))> Produksjon
True True>
En bieffekt av å bruke direkte underklassing er at det er mulig å finne alle implementeringene av plugin-en din ved å spørre basisklassen om listen over kjente klasser avledet fra den.
Konkrete metoder i abstrakte basisklasser
Konkrete klasser inneholder kun konkrete (normale) metoder, mens abstrakte klasser kan inneholde både konkrete metoder og abstrakte metoder.
Den konkrete klassen gir en implementering av abstrakte metoder, den abstrakte basisklassen kan også gi en implementering ved å påkalle metodene via super(). La se over eksemplet for å påkalle metoden ved å bruke 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()> Produksjon
Abstract Base Class subclass>
I programmet ovenfor kan vi påkalle metodene i abstrakte klasser ved å bruke super().
Abstrakte egenskaper i Python
Abstrakte klasser inkluderer attributter i tillegg til metoder, du kan kreve attributtene i konkrete klasser ved å definere dem med @abstractproperty.
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)>
Produksjon
Can't instantiate abstract class parent with abstract methods geeks child class>
I eksemplet ovenfor kan ikke Base-klassen instansieres fordi den kun har en abstrakt versjon av egenskaps-getter-metoden.
Abstrakt klasseinstansering
Abstrakte klasser er ufullstendige fordi de har metoder som ikke har noen. Hvis Python tillater å lage et objekt for abstrakte klasser, bruk det objektet hvis noen kaller den abstrakte metoden, men det er ingen faktisk implementering å påberope seg.
Så vi bruker en abstrakt klasse som mal, og etter behov utvider vi den og bygger på den før vi kan bruke den. På grunn av det faktum, er en abstrakt klasse ikke en konkret klasse, den kan ikke instansieres. Når vi lager et objekt for den abstrakte klassen det reiser en feil .
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()> Produksjon:
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>