我試圖攔截Python的雙下劃線的魔術方法在新的風格類的呼叫。這是一個簡單的例子,但它表明的意圖:我如何能攔截到新式類Python的「神奇」的方法的調用?
class ShowMeList(object):
def __init__(self, it):
self._data = list(it)
def __getattr__(self, name):
attr = object.__getattribute__(self._data, name)
if callable(attr):
def wrapper(*a, **kw):
print "before the call"
result = attr(*a, **kw)
print "after the call"
return result
return wrapper
return attr
如果我周圍使用清單代理對象,我得到了非魔術方法預期的行爲,但我的包裝功能絕不會爲魔術方法。
>>> l = ShowMeList(range(8))
>>> l #call to __repr__
<__main__.ShowMeList object at 0x9640eac>
>>> l.append(9)
before the call
after the call
>> len(l._data)
9
如果我不從對象(第一行class ShowMeList:
)繼承一切正常:
>>> l = ShowMeList(range(8))
>>> l #call to __repr__
before the call
after the call
[0, 1, 2, 3, 4, 5, 6, 7]
>>> l.append(9)
before the call
after the call
>> len(l._data)
9
如何做到這一點攔截與新式類?
你到底想通過截獲雙下劃線的方法呢?還是僅僅因爲好奇? – thesamet 2012-01-29 23:31:28
我總是在這裏列出所有魔術方法:https://github.com/niccokunzmann/wwp/blob/6df6d7f60893a23dc84a32ba244b31120b1241a9/magicMethods。py(生成的,所以它適用於python 2和3) – User 2013-02-18 22:13:28
實際上,你想要做的就是攔截對新樣式類的_instances_的魔術方法的調用 - 但這仍然是一個很好的問題。 – martineau 2013-11-13 02:24:39