洗礼灵魂,修炼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那么智能,当然不止了。
放心,下一篇文章会给出一个大招,嘿嘿
洗礼灵魂,修炼python(38)--面向对象编程(8)—从算术运算符进一步认识魔法方法的更多相关文章
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- Python之面向对象编程学习
不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...
- python笔记 面向对象编程从入门到高级
目录: 一.概念 二.方法 2.1组合 2.2继承 2.3多态 2.4封装 2.5归一化设计 三.面向对象高级 3.1 反射(自省) 3.2 内置方法__getatter__, __ ...
- Python:面向对象编程3 定制类(有更新)
Python:面向对象编程3 定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...
- sdut 在机器上面向对象编程练习11(运算符重载)
在机器上面向对象编程练习11(运算符重载) Time Limit: 1000MS Memory limit: 65536K 标题叙述性说明 有两个矩阵a和b,均为2行3列,求两个矩阵之和.重载运算符& ...
- python基础-面向对象编程
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...
- python之面向对象编程
1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...
- 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) # ...
- python的面向对象编程
面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...
随机推荐
- Mysql数据库操作命令行小结
-- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1; -- students表 create ...
- Python基础教程(第3版) 笔记(二)
1.8模块Python提供了完成(某人的年 龄为32.9,并想将这个值向下圆整为32,因为他还没有满33岁)这种任务的函 数floor.导入模块,可以使用特殊命令import.函数floor包含在模块 ...
- 课程三(Structuring Machine Learning Projects),第一周(ML strategy(1)) —— 0.Learning Goals
Learning Goals Understand why Machine Learning strategy is important Apply satisficing and optimizin ...
- CSRF理解和实战
目录 啥是CSRF攻击 写一个CSRF攻击 如何避免CSRF攻击 啥是CSRF攻击 CSRF(Cross-site request forgery)跨站请求伪造,CSRF通过伪装来自受信任用户的请求来 ...
- js从一个对象数组中根据属性值大小排序
<script type="text/javascript"> var sdts = [ {name:"小明",age:30}, {name:&qu ...
- DataAnnotations - InverseProperty Attribute:
DataAnnotations - InverseProperty Attribute: We have seen in the Code-First Convention section that ...
- SpringMVC教程4
SpringMVC教程3 一.数据回写 数据回写:在做数据更新的时候服务端查询的数据自动填充到表单中. 1.1默认方式 通过前面讲解的 Map Mode ModelMap绑定数据 @RequestMa ...
- VPS杂谈(一)
1. VPS购买推荐 可参考:http://www.laozuo.org/myvps 2. VPS配置SSH端口号 购买的VPS的主机,一般情况下端口号不是22,被改成了其它的,这个时候为了方便自己的 ...
- Aspose.Cells API 中文版文档 下载
链接: https://pan.baidu.com/s/19foJyWgPYvA7eIqEHJ_IdA 密码: yxun
- MYSQL中SHOW的使用整理收藏
好记性不如乱笔头吧....下面收藏整理了mysql中show 的使用技巧....有需要的博友可以看看哈 a. show tables或show tables from database_name; / ...