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!