我有一个向量类:
class Vector:
def __init__(self, x, y):
self.x, self.y = x, y
def __str__(self):
return '(%s,%s)' % (self.x, self.y)
def __add__(self, n):
if isinstance(n, (int, long, float)):
return Vector(self.x+n, self.y+n)
elif isinstance(n, Vector):
return Vector(self.x+n.x, self.y+n.y)
它很好用,也就是说,我可以写:
a = Vector(1,2)
print(a + 1) # prints (2,3)
但是,如果操作顺序颠倒,则失败:
a = Vector(1,2)
print(1 + a) # raises TypeError: unsupported operand type(s)
# for +: 'int' and 'instance'
我理解错误:向
int
对象添加Vector
对象是未定义的,因为我没有在int
类中定义它。有没有一种方法可以解决这个问题而不在int
类(或int
的父类)中定义它? 最佳答案
您还需要定义__radd__
有些操作不一定像这样评估a+b==b+a,这就是为什么python定义了add和radd方法。
更好地解释我自己:它支持这样一个事实,即“int”没有定义一个包含+
实例的class Vector
操作作为操作的一部分。因此向量+1与1+向量不同。
当python试图查看1.__add__
方法可以做什么时,会引发异常。而python会寻找Vector.__radd__
操作来尝试完成它。
在OP的情况下,评估是真实的,并且满足于__radd__ = __add__
class Vector(object):
def __init__(self, x, y):
self.x, self.y = x, y
def __str__(self):
return '(%s,%s)' % (self.x, self.y)
def __add__(self, n):
if isinstance(n, (int, long, float)):
return Vector(self.x+n, self.y+n)
elif isinstance(n, Vector):
return Vector(self.x+n.x, self.y+n.y)
__radd__ = __add__
a = Vector(1, 2)
print(1 + a)
哪些输出:
(2,3)
这同样适用于所有类似数字的操作。