Abstraktni razred se lahko šteje za načrt za druge razredi . Omogoča vam, da ustvarite niz metod, ki jih je treba ustvariti znotraj katerega koli podrejenega razreda, zgrajenega iz abstraktnega razreda.
java zbirke java
Razred, ki vsebuje eno ali več abstraktnih metod, se imenuje an abstraktni razred . An abstraktna metoda je metoda, ki ima deklaracijo, vendar nima izvedbe.
Abstraktni razred uporabljamo, ko načrtujemo velike funkcionalne enote ali ko želimo zagotoviti skupen vmesnik za različne izvedbe komponente.
Abstraktni osnovni razredi v Pythonu
Z definiranjem abstraktnega osnovnega razreda lahko definirate skupni Vmesnik aplikacijskega programa (API) za niz podrazredov. Ta zmožnost je še posebej uporabna v primerih, ko bo tretja oseba zagotovila implementacije, na primer z vtičniki, lahko pa vam pomaga tudi pri delu v veliki skupini ali z veliko kodno bazo, kjer je ohranjanje vseh razredov v mislih težko ali ne mogoče.
Delo na abstraktnih razredih Python
Privzeto, Python ne zagotavlja abstraktni razredi . Python je opremljen z modulom, ki zagotavlja osnovo za definiranje A abstraktni osnovni razredi (ABC) in to ime modula je ABC .
ABC deluje tako, da metode osnovnega razreda okrasi kot abstrakt in nato registrira konkretne razrede kot implementacije abstraktne baze. Metoda postane abstraktna, ko je okrašena s ključno besedo @abstractmethod.
Primer 1:
Ta koda definira abstraktni osnovni razred, imenovan Poligon z uporabo modula ABC (Abstract Base Class) v Pythonu. Razred Polygon ima abstraktno metodo, imenovano noofsides ki ga morajo izvajati njegovi podrazredi.
Obstajajo štirje podrazredi mnogokotnika: trikotnik, peterokotnik, šestkotnik in štirikotnik. Vsak od teh podrazredov preglasi metodo noofsides in zagotovi lastno implementacijo s tiskanjem števila strani, ki jih ima.
V kodi gonilnika so ustvarjeni primerki vsakega podrazreda in metoda noofsides je klicana na vsakem primerku, da prikaže število stranic, značilnih za to obliko.
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()> Izhod
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>
Primer 2:
kaj je hibernacija v Javi
Tu ta koda definira abstraktni osnovni razred, imenovan Animal, z uporabo modula ABC (Abstract Base Class) v Pythonu. Razred Animal ima neabstraktno metodo, imenovano move, ki nima nobene implementacije. Opredeljeni so štirje podrazredi živali: človek, kača, pes in lev. Vsak od teh podrazredov preglasi metodo premikanja in zagotavlja lastno implementacijo s tiskanjem specifične značilnosti premikanja.
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()> Izhod
I can walk and run I can crawl I can bark I can roar>
Implementacija abstrakta prek podrazreda
Z ustvarjanjem podrazredov neposredno iz baze se lahko izognemo potrebi po eksplicitni registraciji razreda. V tem primeru se za prepoznavanje uporablja upravljanje razreda Python Implementacija vtičnika kot izvajanje abstraktna baza vtičnikov .
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))> Izhod
True True>
Stranski učinek uporabe neposrednega podrazreda je, da je možno poiskati vse izvedbe vašega vtičnika tako, da osnovni razred vprašate za seznam znanih razredov, izpeljanih iz njega.
Konkretne metode v abstraktnih osnovnih razredih
Konkretni razredi vsebujejo samo konkretne (normalne) metode, medtem ko lahko abstraktni razredi vsebujejo konkretne in abstraktne metode.
Konkretni razred zagotavlja implementacijo abstraktnih metod, abstraktni osnovni razred lahko zagotovi tudi implementacijo s priklicem metod prek super(). Oglejmo si primer za priklic metode z uporabo super():
dolgo nanizatiPython
# 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()> Izhod
Abstract Base Class subclass>
V zgornjem programu lahko prikličemo metode v abstraktnih razredih z uporabo super().
Abstraktne lastnosti v Pythonu
Abstraktni razredi poleg metod vključujejo tudi atribute, atribute lahko zahtevate v konkretnih razredih, tako da jih definirate z @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)>
Izhod
Can't instantiate abstract class parent with abstract methods geeks child class>
V zgornjem primeru razreda Base ni mogoče instancirati, ker ima samo abstraktno različico metode pridobivanja lastnosti.
Instancija abstraktnega razreda
Abstraktni razredi so nepopolni, ker imajo metode, ki nimajo nikogar. Če Python dovoljuje ustvarjanje predmeta za abstraktne razrede, nato uporabo tega predmeta, če kdo pokliče abstraktno metodo, vendar ni dejanske izvedbe, ki bi jo lahko priklicali.
Torej uporabimo abstraktni razred kot predlogo in ga glede na potrebe razširimo in nadgradimo, preden ga lahko uporabimo. Zaradi dejstva, da abstraktni razred ni konkreten razred, ga ni mogoče instancirati. Ko ustvarimo objekt za abstraktni razred, ga sproži napako .
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()> Izhod:
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>