zoukankan      html  css  js  c++  java
  • 洗礼灵魂,修炼python(38)--面向对象编程(8)—从算术运算符进一步认识魔法方法

    上一篇文章了解了魔法方法,相信你已经归魔法方法至少有个概念了,那么今天就进一步的认识魔法方法。说这个之前,大脑里先回忆一下算术操作符。

    什么是算术操作符?忘记没有?忘记了的自己倒回去看我前面的博文或者自己网上找吧。

    +,-,*,/,**,//,%(用法忘记了的回去看)是不是一般就这些,那么你有没有想过,为什么使用算术符里的某一个符号时程序就会乖乖听话的怎么操作?难道它里面嵌入了一个计算机器功能?难道它一被龟数开发出来就可以运算?都不是很准确,而是因为—魔法方法

    不饶弯子了,看图:

    运算符魔法方法(又叫运算符重载)

    (图片来自网络)

    看到了吧?每个算术操作符都对应一个魔法方法,而前面我们知道魔法方法会在特定条件自动调用的,那个所谓的特定条件就是使用对应的操作符号,然后在程序运行时它就是自动调用执行。现在懂了为什么了吧?

    那么这些对应的魔法方法可以不可以让它不对应运行呢?比如我把加减法对换,可以的啊,python就是这么自由:

    首先,+,对应的__add__,- ,对应的__sub__。

    看例子:

    注意:

    1.定义的类里才会对加减法对换生效,默认不会改变

    2.注意这里返回时的写法

    你可能要问为什么这么写呢?

    那你想,我这么写呢:

    报错意思是:在调用Python对象超出最大递归深度。

    我们这个程序产生了无限递归,永远没有结果输出。

    为什么会产生无限递归呢?

    因为此时的self就是绑定的a,other即为b,return出a+b

    那么我用pycharm来debug一下看看:

    (略过无用步骤)刚开始到这里:

    然后进入类

     再次运行:

    发现又回去了,再运行,又到这里来了

    然后运行无数次,永远都是进去了又出来,再进去,再出来,前面我们知道self这个参数要绑定自身的原因,它永远把自定绑定传进去出来绑定还是自己又运行一次方法,造成这样的无限递归。

    但是你如果一意孤行,就要利用self参与计算,可以这样:

     好的,按照正常的写法规范来思考,我们先看看最开始算术操作符是怎么计算的:

    我们看下整形数的属性和方法:

    也就是说,当我们进行1+3时,会自动调用1的__add__方法和3相加,然后注意:直接这么写是不行的

    虽然可以有其方法,但是1是继承的整形int的方法,所以无法直接调用,而这样是可以的:

    那么这个写法正是上面的例子里我们用的方法

    再看,官方文档里是这么解释的:

    好,我们导入其模块,再计算看看:

    发现其实和直接用int的魔法方法是一样的。但都必须符合这种格式的写法

    那么看到这里,我想你应该知道上面为什么是那种写法了吧?

    你以为只有算术操作符就完了?不可能的,这么点内置魔法方法就能让python那么智能,当然不止了。

    放心,下一篇文章会给出一个大招,嘿嘿

  • 相关阅读:
    jQuery Ajax 实例 全解析
    简易的AJAX工具[转]
    一些JSON 教程
    写一个ajax程序就是如此简单
    ecshop中ajax的调用原理 1
    ECSHOP中ajax的调用原理
    ul中li分列显示
    PHP serialize & JSON 解析
    c++字符集之间转换(UTF-8,UNICODE,Gb2312)
    各种字符集和编码直接的联系详解
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/7686274.html
Copyright © 2011-2022 走看看