我目前正在学习python运算符重载(确切地说是__radd__
和__add__
),我有以下代码
class Commuter1:
def __init__(self, val):
self.val = val
def __add__(self, other):
print('add', self.val, other)
return self.val + other
def __radd__(self, other):
print('radd', self.val, other)
return other + self.val
x = Commuter1(88)
y = Commuter1(99)
print(x + y)
我得到了以下结果
单独使用时,我了解__radd__
和__add__
的工作方式。但是对于行x + y
,我不确定为什么同时引发了__radd__
和__add__
方法。
答案 0 :(得分:2)
首先,Python查看x
和y
的类型,以确定是调用x.__add__
还是y.__radd__
。由于它们都是同一类型Commuter1
,因此它将首先尝试x.__add__
。
然后,在您的__add__
方法中,执行以下操作:
return self.val + other
因此,Python会查看self.val
和other
的类型,以确定是调用self.val.__add__
还是other.__radd__
。由于它们是int
和Commuter1
无关的类型,因此它首先尝试int.__add__
。
但是int.__add__
返回的NotImplemented
是未知类型,因此Python会回退到调用other.__radd__
。
在您的__radd__
方法中,您可以执行以下操作:
return other + self.val
因此,Python会查看other
和self.val
的类型,以确定是调用other.__add__
还是self.val.__radd__
。由于它们都是同一类型int
,因此它将首先尝试__add__
。
当然,int.__add__
适用于另一个int
,因此它返回+
内的内部__radd__
的值,并返回该值,该值将返回返回的+
内的__add__
,将返回您打印的顶层+
的值。