Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Perintah Resolusi Kaedah (MRO) Berbeza Antara Kelas Legasi dan Gaya Baharu dalam Python?

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

Barbara Streisand
Barbara Streisandasal
2024-10-28 05:49:02178semak imbas

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

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'

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'>)

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'

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!

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