Clases abstractas en Python

Una clase abstracta puede considerarse como 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 denomina clase abstracta. Un método abstracto es un método que tiene una declaración pero no tiene una implementación. Mientras diseñamos unidades funcionales grandes, usamos una clase abstracta. Cuando queremos proporcionar una interfaz común para diferentes implementaciones de un componente, usamos una clase abstracta. 
  
Por qué usar clases base abstractas: 
Al definir una clase base abstracta, puede definir una interfaz de programa de aplicación (API) común para un conjunto de subclases. Esta capacidad es especialmente útil en situaciones en las que un tercero proporcionará implementaciones, como con complementos, pero también puede ayudarlo cuando trabaja en un equipo grande o con una gran base de código donde es difícil tener en cuenta todas las clases. o no es posible. 
  
Cómo funcionan las clases de base abstracta: 
de forma predeterminada, Python no proporciona clases abstractas. Python viene con un módulo que proporciona la base para definir clases de base abstracta (ABC) y ese nombre de módulo es ABC. A B Cfunciona 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 está decorado con la palabra clave @abstractmethod. Por ejemplo –
 

Código 1:

Python3

# 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

  
Código 2: 

Python3

# 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 a través de subclases: 
al subclasificar 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 que PluginImplementation implementa la PluginBase abstracta. 
 

Python3

# 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 ella. 
  
Métodos concretos en clases base abstractas: 
las clases concretas contienen solo 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 a través de super(). 
 

Veamos el ejemplo para invocar el método usando super():  

Python3

# Python program invoking a
# method using super()
 
import abc
from abc import ABC, abstractmethod
 
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 super(). 
  
Propiedades 
abstractas: las clases abstractas incluyen atributos además de métodos, puede requerir los atributos en clases concretas definiéndolos con @abstractproperty. 
 

Python3

# 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 captador de propiedades. 
  
Instanciación de clase 
abstracta: las clases abstractas están incompletas porque tienen métodos que no tienen nadie. 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. Así que usamos una clase abstracta como plantilla y, de acuerdo con la necesidad, la ampliamos y construimos sobre ella antes de que podamos usarla. Debido al hecho, una clase abstracta no es una clase concreta, no se puede instanciar. Cuando creamos un objeto para la clase abstracta, genera un error
 

Python3

# 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

Publicación traducida automáticamente

Artículo escrito por bestharadhakrishna y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *