当前位置: 首页 > 面试题库 >

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

荆城
2023-03-14
问题内容

我编写了一个类来表示Python中的向量(作为练习),但在扩展内置运算符时遇到了问题。

__mul__为向量类定义了一个方法。问题在于,x * y解释器在表达式中调用__mul__x而不是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*__()特殊方法一样调用该方法,否则操作将引发a
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() '''


 类似资料:
  • 问题内容: 问题是:编写一个交换两个变量的方法。这两个变量应该是原语。它不需要是通用的,例如两个变量。有办法吗? 问题答案: 如果不使用数组或对象,不可以,无法在方法中进行操作。

  • 问题内容: 在JavaScript中使用构造函数创建类时,以后是否可以重新定义类的方法? 例: 现在,我想像这样重新定义: 因此,当我创建另一个时,新方法将被称为: 编辑: 我意识到我可以输入“ Hello”或“Hola”之类的参数来完成不同的输出。我还意识到我可以像这样简单地为p2分配一个新函数: 我只是想知道是否可以重新定义类的方法,以便的新实例将使用新方法。 问题答案: 以后可以重新定义类的

  • 我想清除大部分别名定义的PowerShell会话,除了cd、sort、mkdir等常见别名 完成会话后,我希望恢复所有以前已知的别名。 无需卸载模块或注销CmdLets。我只想为我的会话清除别名命名空间。 我可以在如下列表中指定允许的别名: 如何保存和恢复别名? 或 如何启动一个干净的PoSh并只加载基本别名? 以下几行来自我的示例模块。 用法示例: 不幸的是,dir Alias:在调用我的脚本后

  • 问题内容: 就像我们使用__ToString一样,有没有一种方法来定义铸造方法? 问题答案: 无需在php中键入强制类型转换。 编辑: 由于这个话题似乎引起一些混乱,我想我要详细说明一下。 在Java之类的语言中,有两种可能带有类型。编译器有一个关于类型的概念,而运行时还有一个关于类型的想法。编译器的类型与变量相关,而运行时引擎则跟踪值的类型(已将其分配给变量)。变量类型在编译时是已知的,而值类型

  • 我正在远离mysql和mysqli,因为stackoverflow上的许多用户都在不断地谈论它的优点。 我做了一个数据库类,并测试了这个,这与数据库连接良好。我试图更新我准备好的语句,以匹配我在不熟悉的领域,但最终得到以下错误: 它反映了这一行:

  • 可以通过函数语法调用sqrt: 也可以通过方法语法调用: 有没有办法让用户定义的子例程可以通过方法语法调用? 例如,让我们定义sq: 有没有一种方法可以使它作为方法可调用?即。

  • 问题内容: 如果没有可以通过引用传递的方法,如何在java中使我的交换函数有效?有人可以给我一个密码吗? 但是,由于Java通过值传递参数,因此更改不会被反映回来。 问题答案: 你无法创建方法交换,因此在调用swap(x,y)x和y之后将被交换。你可以通过交换可变内容的内容¹来创建此类方法,但这不会更改其对象标识,因此你无法为此定义通用方法。 但是,你可以编写一种方法来交换数组或列表中的两个项目(