logo

Clase abstracte în Python

O clasă abstractă poate fi considerată un model pentru alții clase . Vă permite să creați un set de metode care trebuie create în cadrul oricăror clase copil construite din clasa abstractă.

O clasă care conține una sau mai multe metode abstracte se numește an clasa abstractă . Un metoda abstracta este o metodă care are o declarație, dar nu are o implementare.

Folosim o clasă abstractă în timp ce proiectăm unități funcționale mari sau când dorim să oferim o interfață comună pentru diferite implementări ale unei componente.



Clase de bază abstracte în Python

Prin definirea unei clase de bază abstracte, puteți defini o clasă comună Interfața programului de aplicație (API) pentru un set de subclase. Această capacitate este utilă în special în situațiile în care o terță parte va oferi implementări, cum ar fi plugin-uri, dar vă poate ajuta și atunci când lucrați într-o echipă mare sau cu o bază mare de cod în care este dificil sau nu să păstrați toate clasele în minte. posibil.

dacă altceva în java

Lucrul la clasele Python Abstract

În mod implicit, Piton nu oferă clase abstracte . Python vine cu un modul care oferă baza pentru definirea lui A bstract clase de bază (ABC) și numele modulului este ABC .

ABC funcționează prin decorarea metodelor clasei de bază ca abstract și apoi înregistrarea claselor concrete ca implementări ale bazei abstracte. O metodă devine abstractă atunci când este decorată cu cuvântul cheie @abstractmethod.

Exemplul 1:

Acest cod definește o clasă de bază abstractă numită Poligon folosind modulul ABC (Abstract Base Class) în Python. Clasa Polygon are o metodă abstractă numită noofsides care trebuie implementat de subclasele sale.

piton de cămilă

Sunt definite patru subclase de poligon: triunghi, pentagon, hexagon și patrulater. Fiecare dintre aceste subclase suprascrie metoda noofsides și oferă propria sa implementare prin imprimarea numărului de laturi pe care le are.

În codul driverului, sunt create instanțe ale fiecărei subclase, iar metoda noofsides este apelată pe fiecare instanță pentru a afișa numărul de laturi specifice formei respective.

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

Ieșire
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

Exemplul 2:

Aici, Acest cod definește o clasă de bază abstractă numită Animal folosind modulul ABC (Clasa de bază abstractă) în Python. Clasa Animal are o metodă non-abstractă numită mutare care nu are nicio implementare. Există patru subclase de animale definite: om, șarpe, câine și leu. Fiecare dintre aceste subclase suprascrie metoda de mutare și oferă propria sa implementare prin imprimarea unei caracteristici specifice de mișcare.

sortare matrice java
Piton
# 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()>

Ieșire
I can walk and run I can crawl I can bark I can roar>

Implementarea abstract prin subclasă

Prin subclasarea direct de la bază, putem evita necesitatea înregistrării explicit a clasei. În acest caz, managementul clasei Python este folosit pentru a recunoaște Implementarea pluginului ca implementarea PluginBase abstractă .

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

Ieșire
True True>

Un efect secundar al utilizării subclasării directe este că este posibil să găsiți toate implementările pluginului dvs. solicitând clasei de bază lista claselor cunoscute derivate din aceasta.

Metode concrete în clasele de bază abstracte

Clasele concrete conțin numai metode concrete (normale), în timp ce clasele abstracte pot conține atât metode concrete, cât și metode abstracte.

Clasa concretă oferă o implementare a metodelor abstracte, clasa de bază abstractă poate oferi și o implementare prin invocarea metodelor prin super(). Să privim exemplul pentru a invoca metoda folosind super():

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

Ieșire
Abstract Base Class subclass>

În programul de mai sus, putem invoca metodele din clase abstracte folosind super().

Proprietăți abstracte în Python

Clasele abstracte includ atribute în plus față de metode, puteți solicita atributele în clase concrete definindu-le cu @abstractproperty.

obiect la json în java
Piton
# 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)>

Ieșire
Can't instantiate abstract class parent with abstract methods geeks child class>

În exemplul de mai sus, clasa de bază nu poate fi instanțiată deoarece are doar o versiune abstractă a metodei de obținere a proprietăților.

Instanțierea de clasă abstractă

Clasele abstracte sunt incomplete deoarece au metode care nu au pe nimeni. Dacă Python permite crearea unui obiect pentru clase abstracte, atunci folosiți acel obiect dacă cineva apelează metoda abstractă, dar nu există o implementare reală de invocat.

Deci, folosim o clasă abstractă ca șablon și, în funcție de nevoie, o extindem și construim pe ea înainte de a o putea folosi. Datorită faptului, o clasă abstractă nu este o clasă concretă, nu poate fi instanțiată. Când creăm un obiect pentru clasa abstractă, acesta ridică o eroare .

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

Ieșire:

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>