I am trying to declare an abstract class A with a constructor with a default behavior: all subclasses must initialize a member self.n:
from abc import ABCMeta
class A(object):
__metaclass__ = ABCMeta
def __init__(self, n):
self.n = n
However, I do not want to let the A class be instantiated because, well, it is an abstract class. The problem is, this is actually allowed:
a = A(3)
This produces no errors, when I would expect it should.
So: how can I define an un-instantiable abstract class while defining a default behavior for the constructor?
解决方案
Making the __init__ an abstract method:
from abc import ABCMeta, abstractmethod
class A(object):
__metaclass__ = ABCMeta
@abstractmethod
def __init__(self, n):
self.n = n
if __name__ == '__main__':
a = A(3)
helps:
TypeError: Can't instantiate abstract class A with abstract methods __init__
Python 3 version:
from abc import ABCMeta, abstractmethod
class A(object, metaclass=ABCMeta):
@abstractmethod
def __init__(self, n):
self.n = n
if __name__ == '__main__':
a = A(3)
Works as well:
TypeError: Can't instantiate abstract class A with abstract methods __init__