Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Perintah Penyelesaian Kaedah (MRO) Python memastikan pewarisan kaedah yang tidak jelas dalam kelas gaya baharu?

Bagaimanakah Perintah Penyelesaian Kaedah (MRO) Python memastikan pewarisan kaedah yang tidak jelas dalam kelas gaya baharu?

Barbara Streisand
Barbara Streisandasal
2024-10-31 21:07:01407semak imbas

How does Python's Method Resolution Order (MRO) ensure unambiguous method inheritance in new-style classes?

Perintah Resolusi Kaedah (MRO) dalam Kelas Gaya Baharu

Dalam konteks pengaturcaraan berasaskan kelas Python, Method Resolution Order (MRO ) mentakrifkan urutan di mana kaedah carian dilakukan pada kejadian kelas. Pelaksanaan MRO berbeza antara kelas gaya lama dan gaya baharu.

Warisan Kelas Gaya Lama

Dalam kelas gaya lama, MRO mengikut kedalaman- pendekatan pertama. Apabila mencari kaedah dalam contoh subkelas, penterjemah merentasi hierarki warisan subkelas, mendalam-dahulukan. Kejadian pertama kaedah dalam kelas asas dikembalikan.

Warisan Kelas Gaya Baharu

Dengan pengenalan kelas gaya baharu, semantik MRO ditukar kepada C3 linearisasi. Pendekatan ini menghapuskan kekaburan yang timbul dengan kejadian berbilang kelas asas yang sama dalam hierarki warisan. MRO untuk kelas gaya baharu dikira seperti berikut:


  1. Kelas daun (subkelas tanpa subkelas) diletakkan dalam MRO.

  2. Semua kelas asas ditambahkan pada MRO sebelum subkelasnya.

  3. Untuk setiap kelas asas dalam MRO, ulangi langkah 1-3 secara rekursif untuk subkelasnya.< /li>
  4. Jika kelas asas muncul beberapa kali dalam hierarki, ia hanya disertakan sekali dalam MRO.

Contoh dengan Berbilang Warisan

Pertimbangkan contoh berikut yang melibatkan berbilang warisan dalam kelas gaya baharu:

<code class="python">class Base1(object):
    def amethod(self):
        print("Base1")

class Base2(Base1):
    pass

class Base3(object):
    def amethod(self):
        print("Base3")

class Derived(Base2, Base3):
    pass

instance = Derived()  
instance.amethod()  
print(Derived.__mro__) </code>

Dalam contoh ini, walaupun Base1 berlaku beberapa kali dalam warisan hierarki, MRO untuk Derived ialah:

(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)

Tertib ini sepadan dengan algoritma linearisasi C3 yang diterangkan di atas. Memandangkan Derived ialah kelas daun, ia diletakkan pertama dalam MRO. Kemudian, kelas asasnya ditambah: Base2 (subkelas Base1) dan Base3, dalam susunan itu. Akhir sekali, objek ditambah sebagai kelas asas muktamad.

Kesimpulan

MRO untuk kelas gaya baharu menyediakan kaedah yang pasti dan tidak jelas untuk menyelesaikan pewarisan kaedah. Ia menghapuskan potensi kekaburan yang mungkin timbul daripada kejadian berbilang kelas asas yang sama, seperti yang berlaku dengan warisan kelas gaya lama.

Atas ialah kandungan terperinci Bagaimanakah Perintah Penyelesaian Kaedah (MRO) Python memastikan pewarisan kaedah yang tidak jelas dalam kelas gaya baharu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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