Cara Warisan Berbilang Mempengaruhi Gelagat super() Python
Warisan berbilang dalam Python memperkenalkan kerumitan dalam penyelesaian kaedah. Python menentukan susunan penyelesaian kaedah (MRO) untuk menetapkan kaedah induk mana yang harus digunakan oleh super().
Dalam contoh anda, Third mewarisi kedua-dua Pertama dan Kedua. Apabila super().__init__() dipanggil dalam Third.__init__(), ia merujuk kepada First.__init__() kerana MRO menilai kelas induk dari kiri ke kanan. Pertama disenaraikan sebelum Kedua dalam rantaian warisan.
Python mengutamakan susunan kelas dalam senarai warisan apabila membina MRO. Oleh itu, dalam contoh berikut, MRO ialah [Keempat, Kedua, Ketiga, Pertama, objek]:
class First(object): def __init__(self): print("first") class Second(First): def __init__(self): print("second") class Third(First): def __init__(self): print("third") class Fourth(Second, Third): def __init__(self): super(Fourth, self).__init__() print("that's it")
Dalam senario ini, Keempat akan memanggil Pertama.__init__() dan bukannya Kedua.__init__() kerana First ditemui dahulu dalam MRO.
Namun, jika perintah pewarisan adalah terbalik:
class Third(Second, First): def __init__(self): print("third")
Kemudian, MRO menjadi [Ketiga, Kedua, Pertama, objek], dan Ketiga pada mulanya akan memanggil Second.__init__().
Terutamanya, Python menguatkuasakan MRO yang koheren . Jika terdapat percanggahan dalam rantaian warisan, ia menimbulkan pengecualian untuk mengelakkan tingkah laku yang tidak dijangka.
Atas ialah kandungan terperinci Bagaimanakah `super()` Python Menyelesaikan Panggilan Kaedah dalam Pewarisan Berbilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!