Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Instance Overriding Tidak Berfungsi untuk Kaedah Khas Seperti `__repr__` dalam Python?

Mengapa Instance Overriding Tidak Berfungsi untuk Kaedah Khas Seperti `__repr__` dalam Python?

Linda Hamilton
Linda Hamiltonasal
2024-12-06 17:01:11681semak imbas

Why Doesn't Instance Overriding Work for Special Methods Like `__repr__` in Python?

Memahami Penggantian Contoh untuk Kaedah Khas

Pertimbangkan kod di bawah:

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
a

Anehnya, repr(a) tidak menghasilkan hasil yang dimaksudkan "A". Mengapa ini, dan bolehkah kita membetulkan tingkah laku ini?

Dalam Python, kaedah khas (yang mempunyai nama yang dikelilingi oleh "__") biasanya digunakan pada kelas, bukannya pada contoh. Ini ialah butiran pelaksanaan CPython, penterjemah standard. Oleh itu, tiada cara langsung untuk mengatasi __repr__() pada kejadian dan mengharapkan ia berfungsi.

Walau bagaimanapun, terdapat penyelesaian tidak langsung:

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

Sekarang, untuk mengatasi __repr__( ) sebagai contoh, cuma gantikan dengan _repr():

setattr(a, "__repr__", MethodType(_repr, a, a.__class__))

Pendekatan ini terbukti berkesan kerana _repr() memanggil kaedah __repr__() asal, yang dilaksanakan pada peringkat kelas.

Sebaliknya, pertimbangkan contoh ini, di mana kita cuba untuk mengatasi kaedah bukan khas:

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

def bar(self):
    return "bar"

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

Dalam kes ini, penggantian berfungsi seperti yang dijangkakan, kerana foo() ialah kaedah bukan khas dan oleh itu dipanggil terus pada kejadian.

Atas ialah kandungan terperinci Mengapa Instance Overriding Tidak Berfungsi untuk Kaedah Khas Seperti `__repr__` 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