Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Mengatasi `__repr__` pada Contoh Tidak Berfungsi dalam Python dan Bagaimana Ia Boleh Dicapai Dengan Berkesan?

Mengapa Mengatasi `__repr__` pada Contoh Tidak Berfungsi dalam Python dan Bagaimana Ia Boleh Dicapai Dengan Berkesan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-28 12:30:11600semak imbas

Why Doesn't Overriding `__repr__` on an Instance Work in Python, and How Can It Be Effectively Achieved?

Mengatasi Kaedah Khas pada Contoh

Pertimbangkan coretan kod di bawah:

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()

print(a) # <__main__.A object at 0x00AC6990>
print(repr(a)) # '<__main__.A object at 0x00AC6990>'

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

print(a) # <__main__.A object at 0x00AC6990>
print(repr(a)) # '<__main__.A object at 0x00AC6990>'

Seperti yang diperhatikan, kaedah __repr__ tersuai tidak dipanggil contoh a. Untuk memahami tingkah laku ini, adalah penting untuk ambil perhatian bahawa:

Dalam CPython (jurubahasa Python standard), kaedah khas dengan nama yang dikelilingi oleh __ biasanya tidak digunakan pada kejadian tetapi pada kelas. Akibatnya, percubaan untuk mengatasi __repr__ secara langsung pada kejadian tidak akan menghasilkan hasil yang diharapkan.

Untuk mengatasi had ini, seseorang boleh memanfaatkan strategi berikut:

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

Di sini, __repr__ memanggil kaedah pembantu _repr, yang kemudiannya memanggil pelaksanaan __repr__ lalai untuk kelas objek. Dengan mengatasi _repr, kami boleh mengatasi __repr__ pada kejadian dengan berkesan.

Atas ialah kandungan terperinci Mengapa Mengatasi `__repr__` pada Contoh Tidak Berfungsi dalam Python dan Bagaimana Ia Boleh Dicapai Dengan Berkesan?. 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