我希望能够让我的类的运算符以我定义的方式与常规类型进行交互。让我们说,例如,我有:
class Mynum(object):
def __init__(self, x):
self.x = x
def __add__(self, other):
return self.x + other.x
a = Mynum(1)
b = Mynum(2)
print a+b
这很好用,但现在如果我尝试做的话:
print a+2
我收到错误,因为int
没有名为x
的成员。如何在课程中定义Mynum
+ int
?这听起来像是装饰者或元类的工作,但我对他们的用法非常不熟悉。 This question似乎相似但不完全相同。
答案 0 :(得分:13)
def __add__(self, other):
if isinstance(other, self.__class__):
return self.x + other.x
elif isinstance(other, int):
return self.x + other
else:
raise TypeError("unsupported operand type(s) for +: '{}' and '{}'").format(self.__class__, type(other))
答案 1 :(得分:4)
class Mynum(object):
def __init__(self, x):
self.x = x
def __add__(self, other):
try:
return self.x + other.x
except AttributeError:
return self.x + other
__radd__=__add__
a = Mynum(1)
b = Mynum(2)
print(a+b)
# 3
print(a+2)
# 3
print(2+a)
# 3
答案 2 :(得分:2)
为什么要使用额外的切换和/或异常处理?使用以下方法将是一种更简单的方法:
class MyNum(object):
def __init__(self, x):
self.x = x
def __add__(self, other):
return other + self.x
__radd__ = __add__
x = MyNum(5)
y = MyNum(6)
print x + 2
7
print 2 + x
7
print x + y
11
print y + x
11