zoukankan      html  css  js  c++  java
  • 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有错误。

  • 相关阅读:
    可编辑多行列表框
    NullableComboBox
    灵活的组合框和编辑控件
    EmrColorComboBox
    Java 中基本类型和字符串之间的转换
    Java 中基本类型和字符串之间的转换
    数据结构实验之排序七:选课名单
    数据结构实验之排序七:选课名单
    数据结构实验之排序四:寻找大富翁
    数据结构实验之排序四:寻找大富翁
  • 原文地址:https://www.cnblogs.com/LLbinGG/p/11135881.html
Copyright © 2011-2022 走看看