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

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

  • 相关阅读:
    [saiku] 系统登录成功后查询Cubes
    216. Combination Sum III
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    211. Add and Search Word
    210. Course Schedule II
    分硬币问题
    开始学习Python
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/7686274.html
Copyright © 2011-2022 走看看