在Python中定义方法别名?

时间:2012-06-29 15:46:47

标签: python class operator-overloading override operator-keyword

我有一个矢量类,我定义了__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: multiplication override 我能做到的:

__rmul__ = __mul__

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

类似的东西:

def __rmul__ = __mul__

3 个答案:

答案 0 :(得分:22)

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

如果您的对象乘以数字,

other将是一个数字。或者它可能是其他东西,例如另一个矢量,你可以测试和处理它。

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

要处理__mul____rmul__应该是相同方法的情况,因为操作是可交换的,您可以在类定义中执行赋值。

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

    __rmul__ = __mul__

答案 1 :(得分:11)

只需将其列为属性:

__rmul__ = __mul__

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

答案 2 :(得分:3)

关键是在Python中,你可以告诉对象如何通过事物来增加自己。这意味着

a * b

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

a.__mul__(b)

b.__rmul__(a)