自定义对象使用算术运算符时__getattr__方法被忽略的问题
Python自定义对象方法转发问题:算术运算符失效
我最近在搞Python自定义对象的时候遇到个头疼的问题:我想让这个对象把所有没定义的方法调用都转发给它的成员属性,普通的自定义方法调用都能正常触发转发逻辑,可一用算术运算符(比如加法)就完全不管用了。
下面是我写的示例类,还有测试时的控制台片段:
class NoAdd(object): member = 0 def __getattr__(self, item): print('NoAdd __getattr__') # 原本的转发逻辑 # return getattr(self.member, item) # 后来尝试单独处理加法特殊方法,还是不行 if item == '__add__': return getattr(self.member, item)
测试时的控制台反汇编简化片段:
>>> # 普通方法调用(正常工作) >>> obj = NoAdd() >>> obj.some_method() # 假设member对象存在这个方法 NoAdd __getattr__ # 正常触发转发,调用了member的some_method >>> # 算术运算符调用(失效) >>> obj + 1 # 直接抛出错误,完全没触发__getattr__
我就纳闷了,为啥普通方法能通过__getattr__转发,像__add__这种算术运算符对应的特殊方法就不行呢?有没有大佬能帮忙解释下原因,或者给个解决办法?
内容的提问来源于stack exchange,提问作者Yos233
相关产品推荐
相关产品推荐

