Si potrebbe considerare using the abc
Abstract Base Class module per contrassegnare __init__
come astratto, e poi andare avanti e richiamare la superclasse __init__
dalla sottoclasse (e, come DorElias suggested, dare la superclasse __init__
un'implementazione banale di 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()
Se si tenta di creare un'istanza tramite parent = AbstractBase()
o parent = AbstractBase.__new__(AbstractBase)
, si otterrà un errore:
TypeError: Can't instantiate abstract class AbstractBase with abstract methods init
Quindi hai la tua sicurezza astratta e irrealizzabile, ma allo stesso tempo sei ancora ben predisposto per alterare tutte le costruzioni di classe dei bambini modificando la costruzione della classe base, come è giusto e corretto.
Correlato: http://stackoverflow.com/questions/14972631/python-abstract-classes-how-to-discourage-stantening – juanchopanza