首頁 > 後端開發 > Python教學 > 可以直接在實例上重寫 Python 的特殊方法嗎?

可以直接在實例上重寫 Python 的特殊方法嗎?

Susan Sarandon
發布: 2024-11-30 04:04:10
原創
177 人瀏覽過

Can You Override Python's Special Methods Directly on Instances?

重寫實例物件上的特殊方法

在Python 中,名稱被雙下劃線包圍的特殊方法通常不會在實例上調用,而是在實例上調用他們的班級。這是標準解釋器 CPython 的實作細節。因此,不可能直接在實例上重寫 __repr__() 並期望使用自訂實作。

例如,考慮以下程式碼:

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
print(a)   # Output: <__main__.A object at 0x0101C5D0>
print(repr(a))  # Output: '<__main__.A object at 0x0101C5D0>'
登入後複製

我們可以看,repr(a) 不會產生「A」的預期結果。

要解決此限制,必須定義一種呼叫原始實作的新方法,如下所示:

class A(object):
    def __repr__(self):
        return self._repr()
    def _repr(self):
        return object.__repr__(self)
登入後複製

現在,您可以透過取代_repr() 來覆寫實例上的__repr__():

setattr(a, "_repr", MethodType(my_repr, a, a.__class__))
登入後複製

其中my_repr 是所需的自訂實作。

以上是可以直接在實例上重寫 Python 的特殊方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板