Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Saya Tidak Boleh Mengatasi Kaedah Khas Secara Terus pada Kejadian Python?
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!