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
Lepaskan: 2024-12-06 17:01:11
asal
701 orang telah melayarinya

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

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

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

setattr(a, "__repr__", MethodType(_repr, a, a.__class__))
Salin selepas log masuk

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

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 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