我有一个矢量类,我定义了__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__
答案 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)