Aquí hay un uso típico de clases base abstractas en python:
from abc import ABC class MyBaseClass(ABC): @abstractmethod def __init__(self): print("Here's some logic that I want all subclasses to have") class ChildClass(MyBaseClass): def __init__(self): super().__init__() print("Here's some additional logic that I want this subclass to have") El comportamiento es el siguiente: no es posible instanciar MyBaseClass , pero es posible crear una subclase, y MyBaseClass incluye la lógica heredada por todas las subclases.
Aquí hay otra forma de obtener este mismo comportamiento:
class MyBaseClass: def __init__(self): if type(self) == MyBaseClass: raise NotImplementedError print("Here's some logic that I want all subclasses to have") class ChildClass(MyBaseClass): def __init__(self): super().__init__() print("Here's some additional logic that I want this subclass to have") Por lo que puedo decir, este enfoque tiene exactamente el mismo comportamiento, tiene la misma cantidad de código, es igualmente explícito y usa solo Python nativo. Entonces, ¿qué hace ABC que este enfoque no puede manejar?
Las clases base abstractas le impiden instanciar un objeto a menos que implemente los métodos abstractos. Esto genera el error de inmediato y lo alerta sobre el hecho de que necesita implementar el método. Esto es especialmente útil si crea una instancia de la clase pero no llama al método hasta después de un largo proceso de ejecución: no generará NotImplementedError hasta que llame al método.
import abc class AbstractClass(abc.ABC): @abc.abstractmethod def test(self): pass class NotAbstractClass: def test(self): raise NotImplementedError() class AbstractInheritor(AbstractClass): pass class NotAbstractInheritor(NotAbstractClass): pass x = AbstractInheritor() # raises error immediately y = NotAbstractInheritor() # no error despite not implementing test De hecho, mi verificador de tipos captura la línea donde creo x , por lo que ni siquiera necesito ejecutar el código para saber que hay un problema. Mientras tanto, y está perfectamente bien.