在Python中覆盖相同类操作数的交换操作

时间:2017-08-09 18:34:53

标签: python oop operator-overloading overloading

我试图理解运算符覆盖如何适用于自定义类的两个操作数。

例如,假设我有以下内容:

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如何解开这种情况,以及如何调用右手添加功能以及左手添加功能。

2 个答案:

答案 0 :(得分:1)

这是因为在您的方法中,您将数据添加到other。这本身就是Adder的一个实例。所以逻辑是:

  • 在x上致电__add__;
  • x.data(一个int)添加到y(Adder实例)
  • 啊,右手操作数是一个__radd__方法的实例,所以
  • 在y上致电__radd__;
  • 将int添加到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__