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有错误。

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/LLbinGG/p/11135881.html
Copyright © 2011-2022 走看看