python – 在什么情况下__rmul__调用?

 
在自定义列表Mylist之后 ,3 * Mylist 报错,Mylist已经重载了 * ,但是3没有,这时同学告诉我可用 __ rmul __
 
 
说我有一个列表l。在什么情况下l .__ rmul __(自我,其他)叫?

我基本上理解了文档,但我也想看到一个例子,澄清它的用法,毫无疑问。

 
当Python试图乘以两个对象时,它首先尝试调用左对象的__mul __()方法。如果左对象没有__mul __()方法(或者方法返回NotImpemented,表示它不适用于正确的操作数),Python想知道正确的对象是否可以进行乘法。如果右操作数与左边的类型相同,Python知道它不能,因为如果左对象不能做到,同一类型的另一个对象肯定不能。

如果两个对象是不同的类型,Python,这是值得一试。然而,它需要一些方法来告诉正确的对象它是操作中的正确的对象,如果操作不是可交换的。 (乘法当然是,但不是所有的运算符都是,在任何情况下*不总是用于乘法!)所以它调用__rmul __()而不是__mul __()。

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

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

在第一种情况下,Python调用字符串的__mul __()方法。字符串知道如何将它自身乘以一个整数,所以一切都很好。在第二种情况下,整数不知道如何用一个字符串乘以自身,所以它的__mul()__返回NotImplemented,而字符串的__rmul()__被调用。它知道做什么,你得到与第一种情况相同的结果。

现在我们可以看到,__rmul()__允许所有的字符串的特殊乘法行为包含在str类中,这样其他类型(如整数)不需要知道任何关于字符串的数据,以便能够乘以它们。一百年后(假设Python仍在使用),你将能够定义一个新的类型,可以乘任何一个整数的顺序,即使int类已经知道了一个多世纪。

顺便说一句,字符串类的__mul __()在一些Python版本中有一个错误。如果它不知道如何乘以一个对象本身,它引发一个TypeError,而不是返回NotImplemented。这意味着即使用户定义的类型具有__rmul __()方法,也不能将字符串乘以用户定义的类型,因为字符串从不允许它有机会。用户定义的类型必须先行(例如Foo()*’bar’而不是’bar’* Foo()),所以它的__mul __()被调用。他们似乎已经固定在Python 2.7(我测试了它在Python 3.2也),但Python 2.6.6有错误。

猜你喜欢

转载自www.cnblogs.com/LLbinGG/p/11135881.html