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
Lepaskan: 2024-11-28 22:14:11
asal
817 orang telah melayarinya

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()
Salin selepas log masuk

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)
Salin selepas log masuk

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__))
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan