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

__rmul__在什么情况下被称为?

南宫才英
2023-03-14
问题内容

说我有一个清单l。在什么情况下被l.__rmul__(self, other)称为?

我基本上理解了文档,但是我也想看到一个示例来毫无疑问地阐明其用法。


问题答案:

当Python尝试将两个对象相乘时,它首先尝试调用左侧对象的__mul__()方法。如果左对象没有__mul__()方法(或者该方法返回NotImplemented,表明它不适用于所讨论的右操作数),则Python希望知道右对象是否可以进行乘法。如果右操作数与左操作数的类型相同,Python就会知道它不能,因为如果左对象不能做到这一点,那么相同类型的另一个对象当然也不能。

但是,如果两个对象的类型不同,Python则值得一试。但是,如果操作不是可交换的,则需要某种方式告诉正确的对象它 是操作中
的正确对象。(当然,乘法不是全部运算符,而且在任何情况下*都不总是用于乘法!)因此它调用__rmul__()而不是__mul__()

例如,请考虑以下两个语句:

print "nom" * 3
print 3 * "nom"

在第一种情况下,Python调用字符串的__mul__()方法。字符串知道如何将自己乘以整数,因此一切都很好。在第二种情况下,整数不知道如何将自身乘以字符串,因此它__mul()__返回NotImplemented__rmul()__调用该字符串。它知道该怎么做,并且您得到与第一种情况相同的结果。

现在我们可以看到,__rmul()__允许 所有
字符串的特殊乘法行为都包含在str该类中,这样其他类型(例如整数)不需要了解任何有关字符串的知识就可以与它们相乘。从现在开始一百年后(假设Python仍在使用中),即使int该类在一个多世纪以来一无所知,您仍可以定义一个可以以任一顺序乘以整数的新类型。

顺便说一下,字符串类__mul__()在某些版本的Python中有一个错误。如果它不知道如何将自己与一个对象相乘,则会引发aTypeError而不是return
NotImplemented。这意味着即使用户定义的类型具有__rmul__()方法,也不能将字符串乘以用户定义的类型,因为字符串永远不会让它有机会。用户定义的类型必须排在第一位(例如Foo() * 'bar'而不是'bar' * Foo()),因此将其__mul__()调用。他们似乎已经在Python
2.7中修复了此问题(我也在Python 3.2中对其进行了测试),但是Python 2.6.6有此错误。



 类似资料:
  • 本文向大家介绍在什么情况下选择webpack?在什么情况下选择rollup?相关面试题,主要包含被问及在什么情况下选择webpack?在什么情况下选择rollup?时的应答技巧和注意事项,需要的朋友参考一下 非要一句话区分的话 如果是用,如果是用其实界限并不是特别明显。在某些特殊情况下可以互用

  • 问题内容: 今天,在浏览各种问题时,我遇到了一个问题,在我看来有点不可思议,为什么一个人要在上面加上a ,对于这种情况会不会有什么真正的原因,所以这只是微不足道的吗? 问题答案: 动画图像作为GUI的BG。我使用HTML来调整此尺寸(x3),但是如果它已经是所需的尺寸,则可以直接将其设置为标签的。 不知道它是否是“真正的”。这似乎是一个主观术语,需要更多说明。我从来没有使用过这种方法,只是想通了,

  • 我正在windows(7.3版)上安装gvim。启动后,我希望设置变量MYVIMRC,但它没有设置。有没有理由不设定。 有一个vimrc文件,因为许多设置与默认设置不同。 我用检查了MYVIMRC的值 gvim可执行文件位于c:\workarea\Vim\vim73中,c:\workare\Vim中的*\u vimrc*(在gvim启动时读取)。启动gvim后,我可以使用 对于版本:我发现系统vi

  • 大家能不能结合自己的项目大小,说明一下。 哨兵+主从模式,会在多大数据量情况下出现性能瓶颈?

  • 请问我们在使用类型注释的时候,何时使用type class名,何时使用class名呢? 我经过如下实验: 比如以上,是否是返回类型为class名称的时候,使用 typeof class名,返回类对象的时候,使用class名?

  • 本文向大家介绍datanode在什么情况下不会备份相关面试题,主要包含被问及datanode在什么情况下不会备份时的应答技巧和注意事项,需要的朋友参考一下 解答: 当分备份数为1时。