Ich habe versucht, das Verhalten mehrerer Vererbungsverhaltens mit Python zu verstehen, also habe ich etwas versucht, aber ich habe keine Ahnung, warum die Ausgabe meines Codes das ist, was es ist. (Ich weiß, dass Diamond -Erbschaft schlecht ist, aber interessiert war zu sehen, was passiert.) < /P>
Code: Select all
class Base:
name = "Base"
def test(self):
print("I am", self.name)
class A(Base):
internal_name = "A"
def __init__(self):
self.name = "A"
super().__init__()
def test(self):
super().test()
print("Called from A")
class B(Base):
internal_name = "B"
def __init__(self):
self.name = "B"
super().__init__()
def test(self):
super().test()
print("Called from B")
class C(A, B):
def __init__(self):
self.name = "C"
A.__init__(self)
B.__init__(self)
def identify(self):
print("Internal name:", self.internal_name)
c = C()
c.test()
c.identify()
< /code>
Die Ausgabe zum Ausführen dieses Codes: < /p>
I am B
Called from B
Called from A
Internal name: A
< /code>
Was ich als Ausgabe erwartet habe: < /p>
C()
ruft den __init __ von c auf, setzt also den Variablennamen auf "c" und ruft dann A .__ init __ auf, er würde Self Self Self überschreiben. Dann das Gleiche gilt für B , überschreibt Self.Name bis "b".
Code: Select all
I am B
Called from A
I am B
Called from B
oder nur ein Anruf, aber der Teil, dass "I Am b" gedruckt wird, einmal , aber das "Von" aufgerufen "erscheint mich zweimal völlig unerwartet. Und dann ist interner_name aus irgendeinem Grund "a", obwohl ich B.Init () zweit angerufen habe, und es ist auch nur die zweite, die aus der Klasse geerbt wurde. Was passiert mit dieser Bestellung?