python - 在二维向量类中覆盖 __mul__ 以保持交换性

标签 python

我定义了以下类:

class Point(object):

    def __repr__(self):
        return "("+str(self.x)+","+str(self.y)+")"

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, point):
        return Point(self.x+point.x,self.y+point.y)

    def __sub__(self, point):
        return Point(self.x-point.x,self.y-point.y)

    def __mul__(self, num):
         return Point(num*self.x,num*self.y)

    def length(self):
        return (self.x**2 + self.y**2)**.5

下面的代码有效:

x = Point(1,2)
y = Point(1,3)
print x+y
print (y+x)
print (x-y)
print (y-x)
print y*3

输出:

(2,5)
(2,5)
(0,-1)
(0,1)
(3,9)

但这不是:

print 3*y

它给出了以下错误:

----> 1 print 3*y
TypeError: unsupported operand type(s) for *: 'int' and 'Point'

这是因为点类被输入到 int mul 函数中,我假设。我怎样才能保留 Point 类中包含的点的定义,并且仍然让 3*y 返回与 y*3 相同的值?

最佳答案

3 * y 

我们在左侧有一个 int 实例,在右侧有一个 Point 实例。 Point 不是 int 的子类。在这种情况下,int.__mul__ 类在这个操作中获得了第一个机会,而 Point.__mul__ 在这件事上没有发言权。

你必须在你的类上实现 Point.__rmul__ 来处理这种情况。

关于python - 在二维向量类中覆盖 __mul__ 以保持交换性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41512646/

相关文章:

python - lambda 函数比较数据框中的两个连续行并创建新列

Python/PyQT QString 不会插入到 MySQL 数据库中

python - 如何在 python 中按顺序 AaB 而不是 ABa 对字符串进行排序

python - 为什么我会收到 pylint 错误 : Module 'socket' has no 'gethostname' member (no-member)?

python - 使用模拟获取所有日志记录输出

Python函数长参数列表

python - 自动扫描文档图像增强

python - 如何更改 EMACS 23 使用的默认 python 版本?

python - 无法将 Pandas 数据框中的列转换为整数数据类型

python - 当我从数据框中的一行中创建一个列表时,它在 for 循环中仅迭代一次,而当对列执行相同操作时,它工作得很好