栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

__rmul__在什么情况下被称为?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

__rmul__在什么情况下被称为?

当Python尝试将两个对象相乘时,它首先尝试调用左侧对象的

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

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

*
都不总是用于乘法!)因此它调用
__rmul__()
而不是
__mul__()

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

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

在第一种情况下,Python调用字符串的

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

现在我们可以看到,

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

顺便说一下,字符串类

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




转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号