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中不支持这种“拦截”?
答案 0 :(得分:4)
要获得完整答案,您需要查看documentation for special method lookup,具体来说:
除了绕过任何实例属性之外 正确性,隐式特殊方法查找一般也绕过 即使对象的元类也是
__getattribute__()
方法。
这是合理的:
以这种方式绕过
__getattribute__()
机器 解释器内速度优化的重要范围,at 处理特殊方法的一些灵活性的成本( 必须在类对象本身上设置特殊方法才能成为 一直由解释者调用。)
请注意,这仅适用于新式类(扩展object
的类),但实际上您应该始终对任何新代码使用新式类。
最简单的解决方案是您需要手动代理您希望重定向到代理类的所有特殊方法。