How define constructor implementation for an Abstract Class in Python?
Making the __init__
an abstract method:
from abc import ABCMeta, abstractmethodclass A(object): __metaclass__ = ABCMeta @abstractmethod def __init__(self, n): self.n = nif __name__ == '__main__': a = A(3)
helps:
TypeError: Can't instantiate abstract class A with abstract methods __init__
Python 3 version:
from abc import ABCMeta, abstractmethodclass A(object, metaclass=ABCMeta): @abstractmethod def __init__(self, n): self.n = nif __name__ == '__main__': a = A(3)
Works as well:
TypeError: Can't instantiate abstract class A with abstract methods __init__
A not so elegant solution can be this:
class A(object): def __init__(self, n): if self.__class__ == A: raise Exception('I am abstract!') self.n = n
Usage
class B(A): passa = A(1) # Will throw exceptionb = B(1) # Works fine as expected.
You can override __new__
method to prevent direct instantiation.
class A(object): __metaclass__ = ABCMeta def __new__(cls, *args, **kwargs): if cls is A: raise TypeError( "TypeError: Can't instantiate abstract class {name} directly".format(name=cls.__name__) ) return object.__new__(cls)
Output:
>>> A()Traceback (most recent call last): File "<ipython-input-8-3cd318a12eea>", line 1, in <module> A() File "/Users/ashwini/py/so.py", line 11, in __new__ "TypeError: Can't instantiate abstract class {name} directly".format(name=cls.__name__)TypeError: TypeError: Can't instantiate abstract class A directly