重寫實例物件上的特殊方法
在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中文網其他相關文章!