You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义对象使用算术运算符时__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:08:23