[英]Why magic methods are not intercepted by __getattr__ implementation in python?
SUBJ。
例:
MyList(object):
def __init__(self, list_to_be_wrapped):
self._items = list_to_be_wrapped
def __getattr__(self, item):
return getattr(self._items, item)
然后
MyList([1, 2, 3])[-1]
將引發: TypeError: 'MyList' object does not support indexing
而:
MyList([1, 2, 3]).pop()
將完美地工作( pop
將被__getattr__
攔截並重定向到_items
)
對我來說,考慮到“通過組合而不是繼承實現自己的容器類型”的情況, __getattr__
攔截魔術方法會非常有用。 為什么python中不支持這樣的“攔截”?
除了為了正確性而繞過任何實例屬性之外,隱式特殊方法查找通常也會繞過
__getattribute__()
方法,甚至是對象的元類。
這是合理的:
以這種方式繞過
__getattribute__()
機制為解釋器中的速度優化提供了很大的空間,代價是在處理特殊方法時有一定的靈活性(必須在類對象本身上設置特殊方法才能始終如一地調用翻譯)。
請注意,這僅適用於新式類(擴展object
類),但實際上您應該始終對任何新代碼使用新式類。
最簡單的解決方案是您需要手動代理您希望重定向到代理類的所有特殊方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.