class M(object):
def __init__(self):
print("M constructor")
super().__init__()
class F(M):
def __init__(self):
print("F constructor")
super().__init__()
class C(F):
def __init__(self):
print("C constructor")
super().__init__()
class D(C,F):
def __init__(self):
print("D constructor")
C().__init__()
D()
Output is:
D constructor
C constructor
F constructor
M constructor
C constructor
F constructor
M constructor
I was expecting:
D constructor
C constructor
F constructor
M constructor
CodePudding user response:
C().__init__()
is effectively equivalent to:
temp = C()
temp.__init__()
When calling C()
, the __init__()
method in the C
class is called automatically, so it prints C constructor
and also calls all the parent constructors.
Then you call the __init__()
method explicitly, so it repeats this process.
If you just want to call the C
constructor without creating a temporary instance, use C.__init__(self)
.
CodePudding user response:
You are creating two objects in your program: a D
object, and a C
object (which you create in the D
constructor, initialize twice by manually calling __init__()
after creating the instance, and then throw away).
If you want to call C
's initializer explicitly in D
's initializer (rather than using super()
) the correct way to do that is:
C.__init__(self)