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

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

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

不饶弯子了,看图:

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

(图片来自网络)

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

那么这些对应的魔法方法可以不可以让它不对应运行呢?比如我把加减法对换,可以的啊,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那么智能,当然不止了。

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

洗礼灵魂,修炼python(38)--面向对象编程(8)—从算术运算符进一步认识魔法方法的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. Python之面向对象编程学习

    不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...

  3. python笔记 面向对象编程从入门到高级

    目录: 一.概念 二.方法    2.1组合 2.2继承 2.3多态 2.4封装 2.5归一化设计 三.面向对象高级   3.1   反射(自省) 3.2   内置方法__getatter__, __ ...

  4. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  5. sdut 在机器上面向对象编程练习11(运算符重载)

    在机器上面向对象编程练习11(运算符重载) Time Limit: 1000MS Memory limit: 65536K 标题叙述性说明 有两个矩阵a和b,均为2行3列,求两个矩阵之和.重载运算符& ...

  6. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  7. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  8. Python(面向对象编程—1)

    class tst: l=[] x=1 a=tst() b=tst() a.l.append('a') b.l.append('b') a.x='a' b.x='b' print(a.l,a.x) # ...

  9. python的面向对象编程

    面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...

随机推荐

  1. Mysql数据库操作命令行小结

    -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1; -- students表 create ...

  2. Python基础教程(第3版) 笔记(二)

    1.8模块Python提供了完成(某人的年 龄为32.9,并想将这个值向下圆整为32,因为他还没有满33岁)这种任务的函 数floor.导入模块,可以使用特殊命令import.函数floor包含在模块 ...

  3. 课程三(Structuring Machine Learning Projects),第一周(ML strategy(1)) —— 0.Learning Goals

    Learning Goals Understand why Machine Learning strategy is important Apply satisficing and optimizin ...

  4. CSRF理解和实战

    目录 啥是CSRF攻击 写一个CSRF攻击 如何避免CSRF攻击 啥是CSRF攻击 CSRF(Cross-site request forgery)跨站请求伪造,CSRF通过伪装来自受信任用户的请求来 ...

  5. js从一个对象数组中根据属性值大小排序

    <script type="text/javascript"> var sdts = [ {name:"小明",age:30}, {name:&qu ...

  6. DataAnnotations - InverseProperty Attribute:

    DataAnnotations - InverseProperty Attribute: We have seen in the Code-First Convention section that ...

  7. SpringMVC教程4

    SpringMVC教程3 一.数据回写 数据回写:在做数据更新的时候服务端查询的数据自动填充到表单中. 1.1默认方式 通过前面讲解的 Map Mode ModelMap绑定数据 @RequestMa ...

  8. VPS杂谈(一)

    1. VPS购买推荐 可参考:http://www.laozuo.org/myvps 2. VPS配置SSH端口号 购买的VPS的主机,一般情况下端口号不是22,被改成了其它的,这个时候为了方便自己的 ...

  9. Aspose.Cells API 中文版文档 下载

    链接: https://pan.baidu.com/s/19foJyWgPYvA7eIqEHJ_IdA 密码: yxun

  10. MYSQL中SHOW的使用整理收藏

    好记性不如乱笔头吧....下面收藏整理了mysql中show 的使用技巧....有需要的博友可以看看哈 a. show tables或show tables from database_name; / ...