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

DDD
Lepaskan: 2024-11-03 22:42:02
asal
617 orang telah melayarinya

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!