Вы могли бы рассмотреть using the abc
Abstract Base Class module отметить __init__
как абстрактные, а затем идти вперед и вызывать суперкласс __init__
из подкласса (и, как DorElias suggested, дают суперкласс __init__
тривиальное реализацию pass
):
from abc import ABCMeta, abstractmethod
class AbstractBase(object, metaclass=ABCMeta):
@abstractmethod # This method must be overridden...
def __init__(self):
print("...but can still be called via super by subclasses have shared construction logic")
pass
class RealChild(AbstractBase):
def __init__(self):
super().__init__() # Won't do anything, UNTIL the day you decide all subclasses of AbstractBase need shared logic
print('do stuff')
child = RealChild()
Если вы попытаетесь создать экземпляр через parent = AbstractBase()
или parent = AbstractBase.__new__(AbstractBase)
, вы получите сообщение об ошибке:
TypeError: Can't instantiate abstract class AbstractBase with abstract methods init
Итак, у вас есть ваша необразованная абстрактная безопасность, но в то же время вы все еще хорошо настроены, чтобы изменить всю конструкцию дочернего класса, изменив конструкцию базового класса, как правильно и правильно.
Связанный: http://stackoverflow.com/questions/14972631/python-abstract-classes-how-to-discourage-instantiation – juanchopanza