我试图理解运算符覆盖如何适用于自定义类的两个操作数。
例如,假设我有以下内容:
class Adder:
def __init__(self, value=1):
self.data = value
def __add__(self,other):
print('using __add__()')
return self.data + other
def __radd__(self,other):
print('using __radd__()')
return other + self.data
我初始化以下变量:
x = Adder(5)
y = Adder(4)
然后继续执行以下操作:
1 + x
using __radd__()
Out[108]: 6
x + 2
using __add__()
Out[109]: 7
上面的两个操作似乎很困难。如果我的自定义类的成员位于" +"的右侧。在加法表达式中,然后使用__radd__
。如果它在左侧,则使用__add__
。当一个操作数属于Adder
类型而另一个操作数属于其他类型时,这适用于表达式。
然而,当我这样做时,我得到以下结果:
x + y
using __add__()
using __radd__()
Out[110]: 9
如您所见,如果两个操作数都属于自定义类,则会调用__add__
和__radd__
。
我的问题是Python如何解开这种情况,以及如何调用右手添加功能以及左手添加功能。
答案 0 :(得分:1)
这是因为在您的方法中,您将数据添加到other
。这本身就是Adder的一个实例。所以逻辑是:
__add__
; x.data
(一个int)添加到y(Adder实例)__radd__
方法的实例,所以__radd__
; y.data
(另一个int)。通常您会检查other
是否是您班级的一个实例,如果是,请添加other.data
而不只是other
。
答案 1 :(得分:1)
这是因为3
1 2 3
1 3 2
2 1 3
和q = int(input().strip())
for a0 in range(q):
x,y,z = input().strip().split(' ')
x,y,z = [int(x),int(y),int(z)]
方法的实施不会对__add__
类的实例进行任何特殊处理。因此,每次__radd__
调用都会导致整数加上Adder实例操作,由于右侧的Adder实例,因此需要Adder
。
您可以通过执行以下操作解决此问题:
__add__