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!