Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah `super()` Menyelesaikan Panggilan Kaedah dalam Pewarisan Berbilang Python?

Bagaimanakah `super()` Menyelesaikan Panggilan Kaedah dalam Pewarisan Berbilang Python?

Mary-Kate Olsen
Lepaskan: 2024-12-27 10:33:14
asal
192 orang telah melayarinya

How Does `super()` Resolve Method Calls in Python Multiple Inheritance?

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")
Salin selepas log masuk

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")
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan