Katakanlah saya memiliki beberapa skenario warisan:
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?
Ada dua pendekatan yang khas untuk menulis C
's __init__
:
- (gaya lama)
ParentClass.__init__(self)
- (gaya baru)
super(DerivedClass, self).__init__()
Namun, dalam kedua kasus, jika kelas induk ( A
dan B
) tidak mengikuti konvensi yang sama, maka kode tidak akan berfungsi dengan benar (beberapa mungkin terlewatkan, atau dipanggil beberapa kali).
Jadi apa cara yang benar lagi? Sangat mudah untuk mengatakan "konsisten saja, ikuti satu atau yang lain", tetapi jika A
atau B
berasal dari perpustakaan pihak ke-3, lalu bagaimana? Apakah ada pendekatan yang dapat memastikan bahwa semua konstruktor kelas induk dipanggil (dan dalam urutan yang benar, dan hanya sekali)?
Edit: untuk melihat apa yang saya maksud, jika saya lakukan:
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")
Lalu saya mendapatkan:
Entering C
Entering A
Entering B
Leaving B
Leaving A
Entering B
Leaving B
Leaving C
Perhatikan bahwa B
init dipanggil dua kali. Jika aku melakukan:
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")
Lalu saya mendapatkan:
Entering C
Entering A
Leaving A
Leaving C
Perhatikan bahwa B
init tidak pernah dipanggil. Jadi sepertinya kecuali saya tahu / mengontrol init tentang kelas yang saya warisi dari ( A
dan B
) saya tidak bisa membuat pilihan yang aman untuk kelas yang saya tulis ( C
).