logo

Abstrakčios klasės Python

Abstrakčią klasę galima laikyti kitų planu klases . Tai leidžia jums sukurti metodų rinkinį, kuris turi būti sukurtas visose antrinėse klasėse, sukurtose iš abstrakčios klasės.

Klasė, kurioje yra vienas ar daugiau abstrakčių metodų, vadinama an abstrakti klasė . An abstraktus metodas yra metodas, turintis deklaraciją, bet neturintis įgyvendinimo.

Mes naudojame abstrakčią klasę, kai projektuojame didelius funkcinius vienetus arba kai norime sukurti bendrą sąsają skirtingiems komponento įgyvendinimams.



Abstrakčios pagrindinės klasės Python

Apibrėždami abstrakčią bazinę klasę, galite apibrėžti bendrą Taikomosios programos sąsaja (API) poklasių rinkiniui. Ši galimybė ypač naudinga tais atvejais, kai trečioji šalis ketina pateikti diegimus, pvz., su įskiepiais, bet taip pat gali padėti dirbant didelėje komandoje arba naudojant didelę kodų bazę, kai sunku ar ne išlaikyti visas klases. galima.

Darbas su Python Abstract pamokomis

Pagal numatytuosius nustatymus Python nenumato abstrakčios klasės . Python yra su moduliu, kuris suteikia pagrindą apibrėžti A bstract Bazinės klasės (ABC) ir modulio pavadinimas yra ABC .

css paryškintas

ABC veikia dekoruodamas bazinės klasės metodus kaip abstrakčią ir tada registruodamas konkrečias klases kaip abstrakčios bazės įgyvendinimus. Metodas tampa abstraktus, kai jį puošia raktinis žodis @abstractmethod.

1 pavyzdys:

Šis kodas apibrėžia abstrakčią bazinę klasę, vadinamą Poligonas naudojant Python ABC (Abstract Base Class) modulį. Daugiakampių klasėje yra abstraktus metodas, vadinamas noofsides kurį turi įgyvendinti jo poklasiai.

Yra apibrėžti keturi daugiakampio poklasiai: trikampis, penkiakampis, šešiakampis ir keturkampis. Kiekvienas iš šių poklasių nepaiso noofsides metodo ir pateikia savo įgyvendinimą spausdindamas turimų pusių skaičių.

Tvarkyklės kode sukuriami kiekvieno poklasio egzemplioriai ir kiekviename egzemplioriuje iškviečiamas metodas noofsides, kad būtų rodomas tai formai būdingų pusių skaičius.

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

Išvestis
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

2 pavyzdys:

Čia šis kodas apibrėžia abstrakčią bazinę klasę, vadinamą „Animal“, naudodamas „Python“ modulį ABC (abstract Base Class). Gyvūnų klasėje yra neabstraktus metodas, vadinamas judėjimu, kuris neturi jokio įgyvendinimo. Apibrėžiami keturi gyvūnų poklasiai: žmogus, gyvatė, šuo ir liūtas. Kiekvienas iš šių poklasių nepaiso judėjimo metodo ir pateikia savo įgyvendinimą, atspausdindamas konkrečią judėjimo charakteristiką.

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

Išvestis
I can walk and run I can crawl I can bark I can roar>

Santraukos įgyvendinimas per poklasį

Subklasifikuodami tiesiogiai iš bazės, galime išvengti būtinybės aiškiai registruoti klasę. Šiuo atveju atpažinti naudojamas Python klasės valdymas Papildinio diegimas kaip įgyvendinant abstract 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))>

Išvestis
True True>

Šalutinis tiesioginio poklasio naudojimo poveikis yra tas, kad galima rasti visus savo įskiepio įgyvendinimus, paprašius bazinės klasės žinomų klasių, gautų iš jos, sąrašo.

Konkretūs metodai abstrakčiose bazinėse klasėse

Konkrečiose klasėse yra tik konkretūs (įprasti) metodai, o abstrakčiose klasėse gali būti ir konkrečių, ir abstrakčių metodų.

Konkreti klasė suteikia abstrakčių metodų įgyvendinimą, abstrakčioji bazinė klasė taip pat gali suteikti įgyvendinimą iškviesdama metodus per super(). Pažvelkime į pavyzdį, kad iškviestumėte metodą naudodami 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()>

Išvestis
Abstract Base Class subclass>

Aukščiau pateiktoje programoje mes galime iškviesti metodus abstrakčiose klasėse naudodami super ().

Abstrakčios ypatybės Python

Abstrakčiose klasėse, be metodų, yra ir atributų, galite reikalauti atributų konkrečiose klasėse, apibrėždami jas @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)>

Išvestis
Can't instantiate abstract class parent with abstract methods geeks child class>

Aukščiau pateiktame pavyzdyje bazės klasės negalima sukurti, nes ji turi tik abstrakčią nuosavybės gavimo metodo versiją.

Abstrakčių klasių egzistavimas

Abstrakčios klasės yra neišsamios, nes jose yra metodų, kurių niekas neturi. Jei Python leidžia sukurti objektą abstrakčioms klasėms, tada naudoti tą objektą, jei kas nors iškviečia abstraktųjį metodą, tačiau nėra realaus diegimo, kurį būtų galima iškviesti.

Taigi, mes naudojame abstrakčią klasę kaip šabloną ir pagal poreikį ją išplečiame ir remdamiesi ja prieš pradėdami naudoti. Dėl to abstrakčioji klasė nėra konkreti klasė, jos negalima kartoti. Kai sukuriame objektą abstrakčiai klasei, tai iškelia klaidą .

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

Išvestis:

styginių statytojas
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>