Python中同类型对象相加时为何不调用__radd__方法?
为什么同类型对象相加时,add__返回NotImplemented不会触发__radd?
你忽略了Python处理同类型对象二元运算符的核心逻辑:当两个操作数是同一类时,如果__add__返回NotImplemented,Python不会再尝试调用__radd__——因为这会导致无限循环的潜在风险(相当于反过来调用另一个实例的__radd__,而参数还是同类型,本质上和原问题完全一致)。
拿你的代码来说:
A() + A()
执行流程是:
- 调用第一个
A实例的__add__,传入第二个A实例,打印"add"后返回NotImplemented。 - Python检查到两个操作数类型相同,此时如果去调用第二个
A实例的__radd__,传入第一个A实例,本质上还是在处理A和A的相加,这和第一步的问题没有区别,Python会判定这种情况无法解决,直接抛出TypeError。
如果操作数是不同类型,逻辑就不一样了。比如执行5 + A():
- 先调用
int的__add__,因为int不知道怎么和A实例相加,返回NotImplemented。 - Python接着调用
A实例的__radd__,传入5,此时会打印"radd"并返回100,不会报错。
如果想让同类型的A实例相加生效,你需要在__add__或者__radd__中明确处理同类型的情况,比如:
class A: def __add__(self, other): if isinstance(other, A): print("add same type") return 200 print("add") return NotImplemented def __radd__(self, other): print("radd") return 100 print(A() + A()) # 输出add same type和200
内容的提问来源于stack exchange,提问作者Gere
相关产品推荐
相关产品推荐

