用户定义的 __mul__ 方法不可交换

发布于 2024-11-30 10:23:45 字数 497 浏览 2 评论 0原文

我编写了一个类来用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

十级心震 2024-12-07 10:23:45

如果您想要不同类型的交换性,您需要实现 <代码>__rmul__()。如果实现的话,如果操作会引发 TypeError,则像所有 __r*__() 特殊方法一样,它会被调用。请注意参数被交换:

class Foo(object):
    def __mul_(self, other):
        ''' multiply self with other, e.g. Foo() * 7 '''
    def __rmul__(self, other):
        ''' multiply other with self, e.g. 7 * Foo() '''

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 a TypeError. Beware that the arguments are swapped:

class Foo(object):
    def __mul_(self, other):
        ''' multiply self with other, e.g. Foo() * 7 '''
    def __rmul__(self, other):
        ''' multiply other with self, e.g. 7 * Foo() '''
時窥 2024-12-07 10:23:45

我相信您正在寻找 __rmul__

I believe you are looking for __rmul__

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文