Una classe abstracta es pot considerar un pla per a altres classes . Us permet crear un conjunt de mètodes que s'han de crear dins de qualsevol classe fill construïda a partir de la classe abstracta.
Una classe que conté un o més mètodes abstractes s'anomena an classe abstracta . An mètode abstracte és un mètode que té una declaració però no té una implementació.
Utilitzem una classe abstracta mentre estem dissenyant grans unitats funcionals o quan volem proporcionar una interfície comuna per a diferents implementacions d'un component.
Classes base abstractes en Python
En definir una classe base abstracta, podeu definir una classe comú Interfície de programa d'aplicació (API) per a un conjunt de subclasses. Aquesta capacitat és especialment útil en situacions en què un tercer proporcionarà implementacions, com ara complements, però també us pot ajudar quan treballeu en un equip gran o amb una base de codi gran on mantenir totes les classes a la vostra ment és difícil o no. possible.
Python de cerca binària
Treballant amb classes abstractes de Python
Per defecte, Python no proporciona classes abstractes . Python ve amb un mòdul que proporciona la base per definir A Classes bàsiques bstract (ABC) i el nom del mòdul és ABC .
ABC funciona decorant mètodes de la classe base com a abstracte i després registrant classes concretes com a implementacions de la base abstracta. Un mètode esdevé abstracte quan es decora amb la paraula clau @abstractmethod.
Exemple 1:
Aquest codi defineix una classe base abstracta anomenada Polígon utilitzant el mòdul ABC (Abstract Base Class) a Python. La classe Polygon té un mètode abstracte anomenat noofsides que ha de ser implementat per les seves subclasses.
Hi ha quatre subclasses de polígons definides: triangle, pentàgon, hexàgon i quadrilàter. Cadascuna d'aquestes subclasses anul·la el mètode noofsides i proporciona la seva pròpia implementació imprimint el nombre de cares que té.
Al codi del controlador, es creen instàncies de cada subclasse i es crida al mètode noofsides a cada instància per mostrar el nombre de costats específics d'aquesta forma.
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()> Sortida
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>
Exemple 2:
Aquí, aquest codi defineix una classe base abstracta anomenada Animal mitjançant el mòdul ABC (classe base abstracta) a Python. La classe Animal té un mètode no abstracte anomenat moviment que no té cap implementació. Hi ha quatre subclasses d'animals definides: humà, serp, gos i lleó. Cadascuna d'aquestes subclasses anul·la el mètode de moviment i proporciona la seva pròpia implementació mitjançant la impressió d'una característica de moviment específica.
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()> Sortida
I can walk and run I can crawl I can bark I can roar>
Implementació de l'abstract a través de la subclasse
Mitjançant la subclassificació directament des de la base, podem evitar la necessitat de registrar la classe de manera explícita. En aquest cas, s'utilitza la gestió de classes Python per reconèixer Implementació del connector com la implementació de la PluginBase abstracte .
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))> Sortida
True True>
Un efecte secundari de l'ús de subclassificació directa és que és possible trobar totes les implementacions del vostre connector demanant a la classe base la llista de classes conegudes derivades d'ella.
emojis d'iphone a Android
Mètodes concrets en classes base abstractes
Les classes concretes només contenen mètodes concrets (normals), mentre que les classes abstractes poden contenir tant mètodes concrets com mètodes abstractes.
La classe concreta proporciona una implementació de mètodes abstractes, la classe base abstracta també pot proporcionar una implementació invocant els mètodes mitjançant super(). Vegem l'exemple per invocar el mètode amb super():
tallar la matriu javaPython
# 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()> Sortida
Abstract Base Class subclass>
Al programa anterior, podem invocar els mètodes en classes abstractes utilitzant super().
Propietats abstractes en Python
Les classes abstractes inclouen atributs a més dels mètodes, podeu requerir els atributs en classes concretes definint-los amb @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)>
Sortida
Can't instantiate abstract class parent with abstract methods geeks child class>
A l'exemple anterior, la classe Base no es pot crear una instancia perquè només té una versió abstracta del mètode d'obtenció de propietats.
Instanciació de classe abstracta
Les classes abstractes són incompletes perquè tenen mètodes que no tenen ningú. Si Python permet crear un objecte per a classes abstractes, feu servir aquest objecte si algú crida al mètode abstracte, però no hi ha cap implementació real per invocar.
Per tant, fem servir una classe abstracta com a plantilla i, segons la necessitat, l'ampliem i construïm a partir d'ella abans de poder utilitzar-la. A causa del fet, una classe abstracta no és una classe concreta, no es pot instanciar. Quan creem un objecte per a la classe abstracta això genera un error .
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()> Sortida:
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>