簡體   English   中英

為什么魔術方法不會被python中的__getattr__實現攔截?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM