Angenommen, ich habe ein Szenario mit Mehrfachvererbung:
class A(object):
# code for A here
class B(object):
# code for B here
class C(A, B):
def __init__(self):
# What's the right code to write here to ensure
# A.__init__ and B.__init__ get called?
Es gibt zwei typische Ansätze zum Schreiben C
‚s __init__
:
- (alter Stil)
ParentClass.__init__(self)
- (neuerer Stil)
super(DerivedClass, self).__init__()
In beiden Fällen funktioniert der Code jedoch nicht richtig , wenn die übergeordneten Klassen ( A
und B
) nicht derselben Konvention folgen (einige werden möglicherweise übersehen oder mehrmals aufgerufen).
Also, was ist wieder der richtige Weg? Es ist leicht zu sagen, "sei einfach konsequent, folge dem einen oder anderen", aber wenn A
oder B
aus einer Bibliothek eines Drittanbieters, was dann? Gibt es einen Ansatz, der sicherstellen kann, dass alle übergeordneten Klassenkonstruktoren aufgerufen werden (und zwar in der richtigen Reihenfolge und nur einmal)?
Bearbeiten: um zu sehen, was ich meine, wenn ich tue:
class A(object):
def __init__(self):
print("Entering A")
super(A, self).__init__()
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
A.__init__(self)
B.__init__(self)
print("Leaving C")
Dann bekomme ich:
Entering C
Entering A
Entering B
Leaving B
Leaving A
Entering B
Leaving B
Leaving C
Beachten Sie, dass B
der Init zweimal aufgerufen wird. Wenn ich mache:
class A(object):
def __init__(self):
print("Entering A")
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
super(C, self).__init__()
print("Leaving C")
Dann bekomme ich:
Entering C
Entering A
Leaving A
Leaving C
Beachten Sie, dass B
der Init nie aufgerufen wird. Es scheint also, dass ich keine sichere Wahl für die Klasse treffen kann, die ich schreibe ( ) , wenn ich nicht die Initialen der Klassen kenne / kontrolliere, von denen ich erbe ( A
und ).B
C