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

标签 python extend built-in

我在 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

但这需要重新定义我想与我的用户定义类一起使用的每个函数。

有没有办法让内置函数正确处理这个问题?

最佳答案

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

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() '''

关于python - 用户定义的 __mul__ 方法不可交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129441/

相关文章:

python - 从张量中随机移除

Python挑战:zombies

javascript - 如何扩展 MarionetteJS 模块以减少代码重复

jquery - 扩展现有的 jQuery 函数

matlab - 为什么 MATLAB 内置函数的结果与我使用相同表达式自己定义函数时得到的结果不同?

python - 如何查看Python的__builtins__源代码?

python - yapsy 无法正确加载插件

python - 超过 24 小时的日期时间格式

Java - 可重用按钮操作处理程序概念问题

bash - 为什么在同一行变量赋值后 shell 内置冒号命令 ":"会导致分配空字符串值?