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