Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah MRO dalam Kelas Python Gaya Baharu Saya Tidak Berkelakuan Seperti Yang Dijangkakan?

Mengapakah MRO dalam Kelas Python Gaya Baharu Saya Tidak Berkelakuan Seperti Yang Dijangkakan?

DDD
DDDasal
2024-11-03 22:42:02685semak imbas

Why Does the MRO in My New-Style Python Class Not Behave as Expected?

MRO (Perintah Resolusi Kaedah) dalam Kelas Gaya Baharu

Dalam Python, Perintah Resolusi Kaedah (MRO) menentukan cara kaedah diselesaikan dalam hal warisan. Dalam kelas gaya baharu, MRO mengikut peraturan tertentu, seperti yang dijelaskan dalam dokumentasi Python secara ringkas (Edisi ke-2).

Dalam contoh yang diberikan, kod menggunakan sintaks kelas gaya baharu, tetapi MRO berkelakuan seolah-olah kelas gaya lama. MRO yang dijangkakan untuk kelas gaya baharu sepatutnya meletakkan Base3 sebelum Base1 untuk membetulkan percanggahan ini.

Perbezaan utama antara MRO dalam kelas gaya lama dan gaya baharu terletak pada cara mereka mengendalikan berbilang warisan apabila moyang yang sama kelas muncul beberapa kali. Dalam kelas gaya lama, pendekatan depth-first boleh membawa kepada penyelesaian kaedah yang salah. Walau bagaimanapun, dalam kelas gaya baharu, corak warisan berlian yang disebut dalam buku dikendalikan dengan betul.

Sebagai contoh, pertimbangkan hierarki warisan berlian berikut:

<code class="python">class A(object):
    x = 'a'

class B(A):
    pass

class C(A):
    x = 'c'

class D(B, C):
    pass</code>

Dalam kelas gaya lama , MRO ialah D - B - A - C - A, membawa kepada nilai x dalam D menjadi 'a'. Walau bagaimanapun, dalam kelas gaya baharu, MRO ialah objek D - B - C - A -, meletakkan C sebelum A dan membenarkan penggantian x dalam C berkuat kuasa. Ini menyelesaikan isu pewarisan berlian.

Oleh itu, MRO yang betul untuk contoh yang diberikan ialah Derived - Base2 - Base1 - Base3 - object, tetapi kod semasa menghasilkan keputusan yang salah disebabkan oleh tingkah laku MRO yang samar-samar. Untuk membetulkan ini, sintaks kelas harus dikemas kini untuk menyatakan secara eksplisit bahawa kelas mewarisi daripada objek untuk menggunakan semantik MRO yang dijangkakan.

Atas ialah kandungan terperinci Mengapakah MRO dalam Kelas Python Gaya Baharu Saya Tidak Berkelakuan Seperti Yang Dijangkakan?. 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