覆盖二维向量类中的__mul__以保持传播性

时间:2017-01-06 19:09:27

标签: 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类中包含的point的定义,并且仍然有3 * y返回与y * 3相同的颜色?

2 个答案:

答案 0 :(得分:7)

3 * y 

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

您必须在课堂上实施Point.__rmul__来处理此案件。

答案 1 :(得分:3)

根据wim的回答,这是一个经过测试和运作的实现:

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

<强>输出

[HttpGet]
public ActionResult Create(int OSSB)

最后两个输出相等表明了操作的可交换性。