句法
object.__radd__(self, other)
Python__radd__() 方法实现了反向加法运算,即用反射、交换的操作数进行加法 。因此,当你调用x + y ,Python会尝试调用 [x.__add__(y)](https://blog.finxter.com/python-__add__/ "Python __add__() Magic Method").只有当该方法在左边的操作数上没有实现时,Python才会尝试在右边的操作数上调用__radd__ ,如果这个方法也没有实现,就会引发一个TypeError 。
我们称这种方法为*"* Dunder Method",即*"Double UnderscoreMethod"(也叫"Magic Method")*。
Python的__add__与__radd__
假设,你想对两个自定义对象x 和y 进行计算+ 操作。
print(x + y)
Python 首先尝试调用左边对象的__add__() 方法x.__add__(y) 。但这可能因为两个原因而失败。
- 方法
x.__add__()首先没有实现,或者 - 方法
x.__add__()已经实现,但是返回一个NotImplemented值,表明数据类型不兼容。
如果失败了,Python 试图通过调用y.__radd__() 对右操作数进行反向加法 来解决这个问题y 。
如果反向加法被实现,Python 知道它不会遇到非交换性操作的潜在问题。如果它只是执行y.__add__(x) 而不是x.__add__(y) ,结果将是错误的,因为当定义为自定义操作时,该操作可能是非交换性的。这就是为什么需要y.__radd__(x) 。
因此,x.__add__(y) 和x.__radd__(y) 之间的区别是,前者计算x + y ,而后者计算y + x - 两者都调用各自定义在对象x 上的方法。
你可以在这里看到这个效果,我们试图在左边的操作数x 上调用这个操作,但是由于它没有实现,Python 只是在右边的操作数y 上调用相反的操作。
class Data_1:
pass
class Data_2:
def __radd__(self, other):
return 'called reverse +'
x = Data_1()
y = Data_2()
print(x + y)
# called reverse +