Una clase abstracta puede considerarse un modelo para otras clases . Le permite crear un conjunto de métodos que deben crearse dentro de cualquier clase secundaria creada a partir de la clase abstracta.
Una clase que contiene uno o más métodos abstractos se llama clase abstracta . Un método abstracto Es un método que tiene una declaración pero no tiene una implementación.
Usamos una clase abstracta mientras diseñamos grandes unidades funcionales o cuando queremos proporcionar una interfaz común para diferentes implementaciones de un componente.
Clases base abstractas en Python
Al definir una clase base abstracta, puede definir una clase común Interfaz del programa de aplicación (API) para un conjunto de subclases. Esta capacidad es especialmente útil en situaciones en las que un tercero va a proporcionar implementaciones, como complementos, pero también puede ayudarle cuando trabaja en un equipo grande o con una base de código grande donde es difícil o no tener todas las clases en mente. posible.
cuadrícula de malla numerosa
Trabajando en clases abstractas de Python
Por defecto, Pitón no provee clases abstractas . Python viene con un módulo que proporciona la base para definir A Clases base abstractas (ABC) y el nombre de ese módulo es A B C .
A B C funciona decorando métodos de la clase base como abstractos y luego registrando clases concretas como implementaciones de la base abstracta. Un método se vuelve abstracto cuando se adorna con la palabra clave @abstractmethod.
Ejemplo 1:
Este código define una clase base abstracta llamada Polígono utilizando el módulo ABC (Clase base abstracta) en Python. La clase Polygon tiene un método abstracto llamado noofsides que debe ser implementado por sus subclases.
Hay cuatro subclases de polígono definidas: triángulo, pentágono, hexágono y cuadrilátero. Cada una de estas subclases anula el método noofsides y proporciona su propia implementación imprimiendo el número de lados que tiene.
En el código del controlador, se crean instancias de cada subclase y se llama al método noofsides en cada instancia para mostrar el número de lados específicos de esa forma.
Pitón # 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()> Producción
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>
Ejemplo 2:
Aquí, este código define una clase base abstracta llamada Animal usando el módulo ABC (Clase base abstracta) en Python. La clase Animal tiene un método no abstracto llamado mover que no tiene ninguna implementación. Hay cuatro subclases de animales definidas: humano, serpiente, perro y león. Cada una de estas subclases anula el método de movimiento y proporciona su propia implementación al imprimir una característica de movimiento específica.
Pitón # 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()> Producción
I can walk and run I can crawl I can bark I can roar>
Implementación de resumen a través de subclases.
Al crear subclases directamente desde la base, podemos evitar la necesidad de registrar la clase explícitamente. En este caso, la gestión de clases de Python se utiliza para reconocer Implementación del complemento como implementar el Base de complementos abstracta .
Pitón # 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))> Producción
True True>
Un efecto secundario del uso de subclases directas es que es posible encontrar todas las implementaciones de su complemento solicitando a la clase base la lista de clases conocidas derivadas de él.
Linux ejecuta cmd
Métodos concretos en clases base abstractas
Las clases concretas contienen sólo métodos concretos (normales), mientras que las clases abstractas pueden contener tanto métodos concretos como métodos abstractos.
La clase concreta proporciona una implementación de métodos abstractos, la clase base abstracta también puede proporcionar una implementación invocando los métodos mediante super(). Veamos el ejemplo para invocar el método usando super():
superíndice en ilustradorPitón
# 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()> Producción
Abstract Base Class subclass>
En el programa anterior, podemos invocar los métodos en clases abstractas usando súper().
Propiedades abstractas en Python
Las clases abstractas incluyen atributos además de métodos; puede requerir los atributos en clases concretas definiéndolas con @abstractproperty.
Pitón # 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)>
Producción
Can't instantiate abstract class parent with abstract methods geeks child class>
En el ejemplo anterior, no se puede crear una instancia de la clase Base porque solo tiene una versión abstracta del método de obtención de propiedades.
Creación de instancias de clases abstractas
Las clases abstractas están incompletas porque tienen métodos que nadie tiene. Si Python permite crear un objeto para clases abstractas, entonces use ese objeto si alguien llama al método abstracto, pero no hay una implementación real para invocar.
Entonces, usamos una clase abstracta como plantilla y, según la necesidad, la ampliamos y construimos sobre ella antes de poder usarla. Debido al hecho de que una clase abstracta no es una clase concreta, no se puede crear una instancia de ella. Cuando creamos un objeto para la clase abstracta, genera un error .
Pitón # 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()> Producción:
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>