How define constructor implementation for an Abstract Class in Python? How define constructor implementation for an Abstract Class in Python? python python

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