Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Saya Tidak Boleh Mengatasi Kaedah Khas Secara Terus pada Kejadian Python?

Mengapa Saya Tidak Boleh Mengatasi Kaedah Khas Secara Terus pada Kejadian Python?

Patricia Arquette
Patricia Arquetteasal
2024-11-28 22:14:11818semak imbas

Why Can't I Override Special Methods Directly on Python Instances?

Mengatasi Kaedah Khas pada Contoh: Penerokaan

Bayangkan situasi di mana anda mempunyai contoh kelas dan anda ingin mengubah suainya kaedah khas, seperti __repr__(). Apabila cuba mengatasi kaedah ini, anda mungkin menghadapi tingkah laku yang tidak dijangka.

Untuk menggambarkan perkara ini, pertimbangkan kod berikut:

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()

Apabila memanggil repr(a), anda mengharapkan untuk memperoleh "A ," memandangkan repr telah ditindih. Walau bagaimanapun, hasilnya tidak seperti yang dijangkakan.

Percanggahan ini berpunca daripada pendekatan Python untuk menggunakan kaedah khas. Biasanya, Python melaksanakan kaedah khas hanya pada kelas itu sendiri, bukan pada kejadiannya. Akibatnya, menulis ganti repr terus pada contoh adalah tidak berkesan.

Untuk mengatasi had ini, pertimbangkan pendekatan berikut:

class A(object):
    def __repr__(self):
        return self._repr()
    def _repr(self):
        return object.__repr__(self)

Dalam kod yang diubah suai ini, repr pada contoh boleh ditimpa dengan menggantikan _repr().

Membezakan tingkah laku ini dengan coretan kod berikut menunjukkan perbezaan antara mengatasi kaedah khas dan kaedah biasa:

class A(object):
    def foo(self):
        return "foo"

def bar(self):
    return "bar"

a = A()
setattr(a, "foo", MethodType(bar, a, a.__class__))

Dalam keadaan ini, foo kaedah khas berjaya diatasi pada contoh. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa keupayaan ini adalah eksklusif untuk kaedah biasa.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengatasi Kaedah Khas Secara Terus pada Kejadian 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