Ausführen von Allgemeinen post-Initialisierung Aufgaben-in vererbten Klassen?
Die Initialisierung einer Gruppe von Klassen, die einen gemeinsamen Elternteil kann in drei Teile unterteilt werden:
- Gemeinsame Initialisierung
- Unterklasse-spezifische Initialisierung
- Gemeinsamen post-Initialisierung
Derzeit die ersten beiden Teile aufgerufen werden, von der __init__
- Methode jedes untergeordneten Klasse, aber der Letzte post-initialization-Teil aufgerufen werden separat, zum Beispiel
class BaseClass:
def __init__(self):
print 'base __init__'
self.common1()
def common1(self):
print 'common 1'
def finalizeInitialization(self):
print 'finalizeInitialization [common2]'
class Subclass1(BaseClass):
def __init__(self):
BaseClass.__init__(self)
self.specific()
def specific(self):
print 'specific'
if __name__ == '__main__':
s = Subclass1() # Don't forget to finalize the initialization
s.finalizeInitialization() # now the object is fully initialized
Gibt es eine Möglichkeit, um nicht zu rufen finalizeInitialization()
? Oder kann man den Anruf auf finalizeInitialization()
in Subclass1
's __init__
(wie in S. Lott Antwort). Das macht das Leben leichter, aber immer noch daran zu erinnern, um die komplette Initialisierung, dieses mal im inneren der "Konstruktor". So oder so gibt es keine Möglichkeit, zu erzwingen, full initialization, das ist, was ich Suche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Version 1 - delegieren alles.
Version 2 - Delegierter nur ein Schritt
Template Method Design Pattern zur Rettung:
Ähnlich S. Lott Ansatz, außer es gibt keine Möglichkeit (kurz überschreiben
__init__
) für die abgeleiteten Klassen zu überschreiben (oder auch anrufen), die gemeinsame Methoden:Möchten Sie vielleicht bieten eine Standard-Implementierung von
specific
imBaseClass
wenn es nicht in Ordnung ist, um eineAttributeError
wenn Sie erstellen eine Instanz einer beliebigen Unterklasse, die nicht seine eigenen Umsetzung.Was ist falsch mit dem Aufruf finalInitilazation von der Unterklasse init?
Wenn Sie den Aufruf mehrerer Methoden in einer bestimmten Reihenfolge, um die es in der Regel bedeutet, dass das design hat Probleme mit zu beginnen (es ist undicht detail). Also ich würde versuchen zu arbeiten, dass Ende.
Auf der anderen Seite, wenn die Menschen von den Klassen abgeleitet werden und ändern müssen, um die Initialisierung sollte man sich bewusst sein, die Auswirkungen - es ist nicht etwas, das Sie haben wollen in Ihre normale API. Alternativ könnten Sie in der defensive die Letzte Initialisierung und überprüfen, dass es wurde als in Methoden, die von ihm abhängen (zu nennen oder eine Ausnahme auslösen, wenn nicht).