为什么魔术方法不会被python中的__getattr__实现拦截?

时间:2015-03-13 23:56:22

标签: python indexing containers magic-methods getattr

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中不支持这种“拦截”?

1 个答案:

答案 0 :(得分:4)

要获得完整答案,您需要查看documentation for special method lookup,具体来说:

  

除了绕过任何实例属性之外   正确性,隐式特殊方法查找一般也绕过   即使对象的元类也是__getattribute__()方法。

这是合理的:

  

以这种方式绕过__getattribute__()机器   解释器内速度优化的重要范围,at   处理特殊方法的一些灵活性的成本(   必须在类对象本身上设置特殊方法才能成为   一直由解释者调用。)

请注意,这仅适用于新式类(扩展object的类),但实际上您应该始终对任何新代码使用新式类。

最简单的解决方案是您需要手动代理您希望重定向到代理类的所有特殊方法。