Bagaimanakah Perintah Resolusi Kaedah (MRO) Berbeza Antara Kelas Legasi dan Gaya Baharu dalam Python?

Barbara Streisand
Lepaskan: 2024-10-28 05:49:02
asal
181 orang telah melayarinya

How Does Method Resolution Order (MRO) Differ Between Legacy and New-Style Classes in Python?

Perbezaan Perintah Penyelesaian Kaedah (MRO) antara Kelas Legasi dan Gaya Baharu

Kelas gaya baharu dalam Python memperkenalkan perubahan ketara dalam susunan resolusi kaedah (MRO) berbanding kelas warisan. Walaupun contoh yang diberikan menunjukkan resolusi MRO dengan betul untuk kelas gaya baharu, mari kita mendalami perbezaan halus yang membezakan kedua-dua pendekatan.

Perbezaan utama muncul apabila kelas nenek moyang muncul beberapa kali dalam kedalaman "naif"- perintah resolusi pertama. Pertimbangkan kes "warisan berlian" berikut:

class A:
    x = 'a'

class B(A):
    pass

class C(A):
    x = 'c'

class D(B, C):
    pass
Salin selepas log masuk

Menggunakan kelas warisan, susunan resolusi ialah: D - B - A - C - A. Dalam susunan ini, A ditemui dahulu, mengakibatkan takrif 'x' disembunyikan oleh definisi seterusnya dalam C.

D.x => 'a'
Salin selepas log masuk

Walau bagaimanapun, kelas gaya baharu menggunakan MRO yang disemak semula:

D.__mro__ = (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
Salin selepas log masuk

Tertib ini memastikan kelas nenek moyang muncul hanya sekali dan selepas semua subkelas mereka. Akibatnya, penggantian seperti pengubahsuaian C bagi 'x' diutamakan.

D.x => 'c'
Salin selepas log masuk

Dengan mengelakkan berbilang kemunculan kelas nenek moyang dalam susunan resolusi, pendekatan ini menghapuskan kekaburan dan memastikan tingkah laku intuitif dalam hierarki warisan yang kompleks. Inilah sebabnya mengapa kelas gaya lama biasanya harus dielakkan memihak kepada kelas gaya baharu, terutamanya apabila berurusan dengan berbilang warisan dan corak seperti berlian.

Atas ialah kandungan terperinci Bagaimanakah Perintah Resolusi Kaedah (MRO) Berbeza Antara Kelas Legasi dan Gaya Baharu dalam 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!