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那么智能,当然不止了。

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

  • 相关阅读:
    关于angular2跳路由防止页面刷新的做法(Angular2路由重载)
    使用JavaScript获取前一周的日期
    关于使用css变量实现主题的切换效果
    关于后端下载后端返回的blob类型文件的下载
    关于前端使用JavaScript无法实现canvas打印问题的解决
    项目管理必备:四款免费但好用的项目管理工具
    高效时间管理的18个黄金法则
    与领导相处,一定要谨记这六句话
    努力工作真能让你进步吗?
    如何在项目管理中建立起良好的团队协作关系
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/7686274.html
Copyright © 2011-2022 走看看