Birden fazla miras senaryom olduğunu söyle:
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?
Yazma için iki tipik yaklaşım var C
'ler __init__
:
- (eski tarz)
ParentClass.__init__(self)
- (Daha yeni tarzı)
super(DerivedClass, self).__init__()
Bununla birlikte, her iki durumda da, üst sınıflar ( A
ve B
) aynı kuralı izlemezse, kod düzgün çalışmaz (bazıları gözden kaçabilir veya birden çok kez çağrılabilir).
Peki yine doğru yol nedir? "Sadece tutarlı olun, birini ya da diğerini takip edin" demek kolaydır, ancak 3. taraf bir kütüphaneden geliyorsa A
ya B
da bir kütüphaneden geliyorsa ne olacak? Tüm üst sınıf kurucularının çağrılmasını (ve doğru sırada ve yalnızca bir kez) sağlayabilecek bir yaklaşım var mı?
Düzenleme: ne demek istediğimi görmek için:
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")
Sonra anladım:
Entering C
Entering A
Entering B
Leaving B
Leaving A
Entering B
Leaving B
Leaving C
O Not B
bireyin init iki defa çağrılır. Eğer yaparsam:
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")
Sonra anladım:
Entering C
Entering A
Leaving A
Leaving C
O Not B
ler çağrılan asla init'. Öyle görünüyor ki miras aldığım sınıfların initini bilmiyor / kontrol etmiyorsam ( A
ve B
) yazdığım sınıf için güvenli bir seçim yapamıyorum ( C
).