首頁 >後端開發 >Python教學 >為什麼實例重寫不適用於 Python 中的「__repr__」等特殊方法?

為什麼實例重寫不適用於 Python 中的「__repr__」等特殊方法?

Linda Hamilton
Linda Hamilton原創
2024-12-06 17:01:11691瀏覽

Why Doesn't Instance Overriding Work for Special Methods Like `__repr__` in Python?

了解特殊方法的實例覆蓋

考慮下面的程式碼:

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
a

令人驚訝的是, repr(a)未產生預期結果「A」。這是為什麼,我們可以糾正這種行為嗎?

在 Python 中,特殊方法(名稱被「__」包圍的方法)通常在類別上調用,而不是在實例上調用。這是標準解釋器 CPython 的實作細節。因此,沒有直接的方法可以在實例上重寫 __repr__() 並期望它能起作用。

但是,有一個間接的解決方案:

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

現在,重寫__repr__( ) 例如,只需將其替換為_repr():

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

這種方法被證明是有效的,因為_repr() 呼叫原始__repr__()方法,該方法是在類別層級實現的。

相反,請考慮這個範例,其中我們嘗試重寫非特殊方法:

class A(object):
    def foo(self):
        return "foo"

def bar(self):
    return "bar"

a = A()
setattr(a, "foo", MethodType(bar, a, a.__class__))

在這種情況下,覆蓋按預期工作,因為foo() 是一個非特殊方法,因此直接在實例上呼叫。

以上是為什麼實例重寫不適用於 Python 中的「__repr__」等特殊方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn