Abstraktia luokkaa voidaan pitää suunnitelmana muille luokat . Sen avulla voit luoda joukon menetelmiä, jotka on luotava kaikissa abstraktista luokasta rakennetuissa lapsiluokissa.
Luokkaa, joka sisältää yhden tai useamman abstraktin menetelmän, kutsutaan an abstrakti luokka . An abstrakti menetelmä on menetelmä, jolla on ilmoitus, mutta jolla ei ole toteutusta.
Käytämme abstraktia luokkaa suunnitellessamme suuria toiminnallisia yksiköitä tai kun haluamme tarjota yhteisen rajapinnan komponentin erilaisille toteutuksille.
Abstraktit perusluokat Pythonissa
Määrittämällä abstraktin perusluokan voit määritellä yhteisen Sovellusohjelmaliittymä (API) alaluokkien sarjalle. Tämä ominaisuus on erityisen hyödyllinen tilanteissa, joissa kolmas osapuoli aikoo tarjota toteutuksia, kuten laajennuksia, mutta se voi myös auttaa työskentelemään suuressa tiimissä tai suuressa koodikannassa, jossa kaikkien luokkien pitäminen mielessäsi on vaikeaa tai ei. mahdollista.
Työskentely Python Abstract -tunneilla
Oletuksena, Python ei tarjoa abstrakteja luokat . Pythonissa on moduuli, joka tarjoaa perustan A:n määrittämiselle bstract Perusluokat (ABC) ja moduulin nimi on ABC .
ABC toimii koristelemalla perusluokan menetelmiä abstraktiksi ja rekisteröimällä sitten konkreettisia luokkia abstraktin perustan toteutuksiksi. Menetelmä muuttuu abstraktiksi, kun se on koristeltu avainsanalla @abstractmethod.
tulosta tähtikuvio
Esimerkki 1:
Tämä koodi määrittelee abstraktin perusluokan nimeltä Monikulmio Pythonin ABC (Abstract Base Class) -moduulin avulla. Polygon-luokassa on abstrakti menetelmä nimeltään noofsides jonka alaluokkien on toteutettava.
Polygoneille on määritelty neljä alaluokkaa: kolmio, viisikulmio, kuusikulmio ja nelikulmio. Jokainen näistä alaluokista ohittaa noofsides-menetelmän ja tarjoaa oman toteutuksensa tulostamalla sillä olevien sivujen lukumäärän.
täysi muoto pvr
Ajurikoodissa luodaan kunkin alaluokan ilmentymät, ja noofsides-menetelmää kutsutaan jokaisessa ilmentymässä näyttämään kyseiselle muodolle ominaisten sivujen lukumäärän.
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()> Lähtö
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>
Esimerkki 2:
Tässä tämä koodi määrittelee abstraktin perusluokan nimeltä Animal käyttämällä Pythonin ABC-moduulia (Abstract Base Class). Animal-luokassa on ei-abstrakti menetelmä nimeltä move, jolla ei ole toteutusta. Eläimillä on neljä alaluokkaa: ihminen, käärme, koira ja leijona. Jokainen näistä alaluokista ohittaa siirtomenetelmän ja tarjoaa oman toteutuksensa tulostamalla tietyn liikkeen ominaisuuden.
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()> Lähtö
I can walk and run I can crawl I can bark I can roar>
Abstractin toteutus alaluokan kautta
Luokittamalla alaluokkiin suoraan kannasta, voimme välttää tarpeen rekisteröidä luokka erikseen. Tässä tapauksessa tunnistamiseen käytetään Python-luokan hallintaa Plugin toteutus täytäntöönpanossa abstrakti 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))> Lähtö
True True>
Suoran alaluokituksen käytön sivuvaikutus on, että on mahdollista löytää kaikki pluginin toteutukset kysymällä perusluokalta siitä johdettu luettelo tunnetuista luokista.
Konkreettiset menetelmät abstrakteissa perusluokissa
Konkreettiset luokat sisältävät vain konkreettisia (normaali) menetelmiä, kun taas abstraktit luokat voivat sisältää sekä konkreettisia menetelmiä että abstrakteja menetelmiä.
Konkreettinen luokka tarjoaa abstraktien menetelmien toteutuksen, abstrakti perusluokka voi myös tarjota toteutuksen kutsumalla menetelmiä super(:n) kautta. Katsotaanpa esimerkkiä menetelmän kutsumiseksi käyttämällä super():
java-taulukko luetteloonPython
# 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()> Lähtö
Abstract Base Class subclass>
Yllä olevassa ohjelmassa voimme kutsua abstraktien luokkien menetelmiä käyttämällä super().
Abstraktit ominaisuudet Pythonissa
Abstraktit luokat sisältävät attribuutteja menetelmien lisäksi, voit vaatia attribuutteja konkreettisiin luokkiin määrittämällä ne @abstractpropertyllä.
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)>
Lähtö
Can't instantiate abstract class parent with abstract methods geeks child class>
Yllä olevassa esimerkissä Base-luokkaa ei voi ilmentää, koska sillä on vain abstrakti versio property-getter-menetelmästä.
Abstract Class Instantiation
Abstraktit luokat ovat epätäydellisiä, koska niissä on menetelmiä, joilla ei ole ketään. Jos Python sallii objektin luomisen abstrakteja luokkia varten, käytetään kyseistä objektia, jos joku kutsuu abstraktia menetelmää, mutta ei ole varsinaista toteutusta vedota.
Käytämme siis abstraktia luokkaa mallina ja tarpeen mukaan laajennamme ja rakennamme sitä ennen kuin voimme käyttää sitä. Abstrakti luokka ei ole konkreettinen luokka, joten sitä ei voi ilmentää. Kun luomme objektin abstraktille luokalle, se aiheuttaa virheen .
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()> Lähtö:
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>