我有一个向量类:

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)

这同样适用于所有类似数字的操作。

09-10 04:05
查看更多