Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Instance Overriding Tidak Berfungsi untuk Kaedah Khas Seperti `__repr__` dalam 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!