Super() dalam Python Multiple Inheritance
Multiple inheritance dalam Python menimbulkan persoalan tentang bagaimana super() berinteraksi dengannya. Pertimbangkan kod berikut:
class First(object): def __init__(self): print("first") class Second(object): def __init__(self): print("second") class Third(First, Second): def __init__(self): super(Third, self).__init__() print("that's it")
Sekarang, kaedah induk Third yang manakah super().__init__ merujuk kepada? Bolehkah anda memilih yang mana satu dijalankan?
Untuk memahami super() dalam konteks ini, kami menyelidiki konsep Kaedah Resolusi Perintah (MRO). Dalam Python, MRO mentakrifkan susunan kaedah diselesaikan apabila berbilang warisan terlibat.
Dalam contoh kami, Third() akan memanggil First.__init__. Python memeriksa setiap atribut dalam ibu bapa kelas dari kiri ke kanan. Untuk __init__, Python mencari di First dahulu, dan jika ia tidak ditemui di sana, ia menyemak dalam Second.
Situasi menjadi lebih kompleks dengan warisan yang saling berkaitan. Baca lebih lanjut mengenai perkara ini dalam catatan blog Guido di MRO. Walau bagaimanapun, Python secara amnya akan mengekalkan susunan pewarisan seperti yang ditulis, bermula dengan kelas anak itu sendiri.
Pertimbangkan contoh berikut:
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")
Di sini, MRO ialah [Keempat, Kedua , Ketiga, Pertama].
Adalah penting untuk ambil perhatian bahawa jika Python tidak dapat menentukan MRO yang koheren, ia menimbulkan pengecualian dan bukannya menggunakan tingkah laku yang berpotensi tidak dijangka.
Selain itu, perlu dinyatakan bahawa contoh yang diberikan tidak menggunakan panggilan super(). Tujuan mereka adalah untuk menunjukkan bagaimana MRO dibina, bukan untuk mencetak output tertentu. Anda digalakkan untuk bereksperimen dengan panggilan super() untuk mendapatkan pemahaman yang lebih mendalam tentang model warisan Python.
Atas ialah kandungan terperinci Bagaimanakah `super()` Menyelesaikan Panggilan Kaedah dalam Pewarisan Berbilang Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!