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

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

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

不饶弯子了,看图:

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

(图片来自网络)

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

那么这些对应的魔法方法可以不可以让它不对应运行呢?比如我把加减法对换,可以的啊,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. [EXP]Drupal < 8.6.10 / < 8.5.11 - REST Module Remote Code Execution

    Analyzing the patch By diffing Drupal and , we can see that in the REST module, FieldItemNormalizer ...

  2. 比较List和ArrayList的性能及ArrayList和LinkedList优缺点

    List和ArrayList的性能比较 在使用ArrayList这样的非泛型集合的过程中,要进行装箱和拆箱操作,会有比较大的性能损失,而使用泛型集合就没有这样的问题.List是泛型,而ArrayLis ...

  3. 国外程序员整理的 C++ 资源大全 (zt)

    关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz 发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包括了S ...

  4. Spring Boot + Spring Cloud 构建微服务系统(九):配置中心(Spring Cloud Config)

    技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每个项目都散落着各种配置文件,且随着服务的增加而不断增多.此时,往往某一个基础服务信息变更,都会导致一系列服务的更新和重启, ...

  5. ASP.NET MVC 5 Authentication Breakdown

    In my previous post, "ASP.NET MVC 5 Authentication Breakdown", I broke down all the parts ...

  6. MultipartFile 多文件上传的应用

    公司的项目很多地方要用到文件上传,以前的上传主要是用apache的fileupload ,使用的感受并不太好.今天试了试spring的MultipartFile,感觉还不错,封装的比较简洁. 当然,中 ...

  7. 实现一个简单的vue-router

    所有项目的源代码都放在我的github上,欢迎大家start: https://github.com/Jasonwang911/my-vue-router 首先来看下vue-router的使用: im ...

  8. 子shell以及什么时候进入子shell

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 子shell的概念贯穿整个shell,写shell脚本时更是不 ...

  9. DataGridView样式生成器使用说明

    啥都不说先看图 一.       功能介绍 1.      winform DataGridView样式代码可视化即时生成,所见即所得 2.      预置DataGridView样式代码方案 预置三 ...

  10. win10 关闭自动更新

    方法一 : 利用组策略关闭win10自动更新的步骤如下:1.按win+R打开“运行”,输入“gpedit.msc”,按下回车. 2.找到“计算机配置”→““管理模板”→“Windows 组件”→“Wi ...