我發現我能夠覆蓋諸如內置類的__iadd__
方法__iadd__和其他經營者的行爲,但我不能重新分配__iadd__
僅僅改變自己的行爲:動態變化
class OverrideList(list):
def __iadd__(self, x):
print("You'll see this")
return list.__iadd__(self, x)
class ReassignList(list):
def iadd(self, x):
print("You'll never see this")
return list.__iadd__(self, x)
def __init__(self, *args, **kw):
list.__init__(self, *args, **kw)
self.__iadd__ = self.iadd
ol = OverrideList()
ol += range(3)
rl = ReassignList()
rl += range(3)
有什麼我可以做的,會讓我ReassignList.iadd?
我最初以爲好笑的約IADD是,這是一個「插槽包裝」,而不是一個方法,但這個片段讓我懷疑:
class OverrideThenReassign(OverrideList):
def iadd(self, x):
print("You won't see this either")
return list.__iadd__(self, x)
def __init__(self, *args, **kw):
list.__init__(self, *args, **kw)
print("OverrideThenReassign.__iadd__ starts out as {} not as a slot wrapper".format(self.__iadd__.__class__))
self.__iadd__ = self.iadd
的動機概括爲writing a PersistentList
subclass of list
技術通過用代碼包裝方法來保存有問題的數據結構到磁盤。有草稿here。編輯:這個問題和this one差不多。這個問題被埋葬在一片飽滿的gobbledygook中,所以我不會把這個標記爲重複,除非一個SO超級巨星建議這樣做。
我想你想使用[代理模式(HTTP: //en.wikipedia.org/wiki/Proxy_pattern)。 –
將這些方法封裝在類級而不是各個實例上。 – user2357112
正如其他答案所說 - 正如我在聊天中所說的 - 除了通過在子類上重新定義它們之外,您不能輕易覆蓋特殊方法。 Python不使用普通屬性查找系統來獲取特殊方法。 –