21

我有一个向量类,我定义了__mul__将向量乘以数字的方法。

这是__mul__方法:

def __mul__(self, other):
    x = self.x * other
    y = self.y * other
    new = Vector()
    new.set_pos((x, y))
    return new

我的问题是我不知道数字和向量之间哪个是哪个。如果 self 是数字,self.x 会引发错误。(我可能在这一点上弄错了:“其他”总是一个数字吗?)

所以我在这里找到:Python:我可以做的乘法覆盖

__rmul__ = __mul__

但我怎么能在类定义中做到这一点?

就像是 :

def __rmul__ = __mul__
4

3 回答 3

26

self永远不会是数字,__mul__()因为方法所附加的对象不是数字,而是向量,根据定义,它是被乘数。

other如果您的对象被一个数字相乘,它将是一个数字。或者它可能是其他东西,例如另一个你可以测试和处理的向量。

当您的对象是乘数时,__rmul__()如果被乘数不知道如何处理操作,则会调用该对象。

要处理 which__mul____rmul__should 是相同方法的情况,因为操作是可交换的,您只需在类定义中进行赋值即可。

class Vector(object):
    def __mul__(self, other):
        pass

    __rmul__ = __mul__
于 2012-06-29T15:54:08.520 回答
14

只需将其列为属性:

__rmul__ = __mul__

这与在模块中创建函数别名的方式相同;在类体内创建方法的别名也是如此。

于 2012-06-29T15:49:00.223 回答
4

关键是在 Python 中,您可以告诉对象如何将自己与事物相乘。这意味着

a * b

可能意味着“告诉a自己乘以b”或“告诉b自己乘以a”。在代码中,这转化为

a.__mul__(b)

或者

b.__rmul__(a)
于 2012-06-29T15:50:30.613 回答