【发布时间】:2017-08-09 18:34:52
【问题描述】:
我正在尝试了解运算符覆盖如何适用于自定义类的两个操作数。
例如,假设我有以下内容:
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 如何解决这种情况,它如何能够同时调用右手加法函数和左手加法函数。
【问题讨论】:
-
我的理解是
5+y应该调用y.__radd__(5)?
标签: python oop operator-overloading overloading