用户定义的 __mul__ 方法不可交换
我编写了一个类来用 Python 表示向量(作为练习),但在扩展内置运算符时遇到问题。
我为向量类定义了一个 __mul__ 方法。问题在于,在表达式 x * y 中,解释器调用 x 的 __mul__ 方法,而不是 y。
所以 vector(1, 2, 3) * 2
返回一个向量 <2, 4, 6>就像它应该的那样;但是 2 * vector(1, 2, 3)
会创建 TypeError,因为内置 int 类不支持与我的用户定义向量相乘。
我可以通过简单地编写一个新的乘法函数来解决这个问题
def multiply(a, b):
try:
return a * b
except TypeError:
return b * a
,但这需要重新定义我想要与用户定义的类一起使用的每个函数。
有没有办法让内置函数正确处理这个问题?
I wrote a class to represent vectors in Python (as an exercise) and I'm having problems with extending the built-in operators.
I defined a __mul__
method for the vector class. The problem is that in the expression x * y
the interpreter calls the __mul__
method of x, not y.
So vector(1, 2, 3) * 2
returns a vector <2, 4, 6> just like it should; but 2 * vector(1, 2, 3)
creates a TypeError because the built-in int class does not support multiplication by my user-defined vectors.
I could solve this problem by simply writing a new multiplication function
def multiply(a, b):
try:
return a * b
except TypeError:
return b * a
but this would require redefining every function that I want to use with my user-defined classes.
Is there a way to make the built-in function handle this correctly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您想要不同类型的交换性,您需要实现 <代码>__rmul__()。如果实现的话,如果操作会引发
TypeError
,则像所有__r*__()
特殊方法一样,它会被调用。请注意参数被交换:If you want commutativity for different types you need to implement
__rmul__()
. If implemented, it is called, like all__r*__()
special methods, if the operation would otherwise raise aTypeError
. Beware that the arguments are swapped:我相信您正在寻找
__rmul__
I believe you are looking for
__rmul__