洗礼灵魂,修炼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当中我们 ...
随机推荐
- 【sping揭秘】17、@Around,@Introduction
package cn.cutter.start.bean; import org.apache.commons.logging.Log; import org.apache.commons.loggi ...
- 浏览器上安装vue devtools
安装前要检查一下node版本的(node -v),必须将版本提高到>4.4.7.低版本的node在安装devtools时执行npm install 时报错.如何升级node版本,若在window ...
- web自动化测试---概述
最早的时候是做功能测试,web都是自己手工点击看看有没问题,没有系统的进行测试,更别说自动化测试了,那是一段不堪回首的往事,就是因为这,很多问题都流出去了,这是作为测试人员的一大失职,痛定思痛,开始学 ...
- MapReduce对交易日志进行排序的Demo(MR的二次排序)
1.日志源文件 (各个列分别是: 账户,营业额,花费,日期) zhangsan@163.com 6000 0 2014-02-20 lisi@163.com 2000 0 2014-02-20 lis ...
- 修改centos 7 系统时间
查看当前系统时间 date 修改当前系统时间 date -s "2018-2-22 19:10:30 查看硬件时间 hwclock --show 修改硬件时间 hwclock --set - ...
- 在Kubernetes中部署GlusterFS+Heketi
目录 简介 Gluster-Kubernetes 部署 环境准备 下载相关文件 部署glusterfs 部署heketi server端 配置heketi client 简介 在上一篇<独立部署 ...
- Java工程师学习指南 中级篇
Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...
- 【Java基本功】一文了解Java中继承、封装、多态的细节
本节主要介绍Java面向对象三大特性:继承 封装 多态,以及其中的原理. 本文会结合虚拟机对引用和对象的不同处理来介绍三大特性的原理. 继承 Java中的继承只能单继承,但是可以通过内部类继承其他类来 ...
- gbk转utf-8
1.文件转码:使用脚本 gbk转u8的脚本文件: #!/bin/bash FILE_SUFFIX="java xml html vm js" # FILE_SUFFIX=&qu ...
- Xdebug在PHP中的安装配置
Xdebug在PHP中的安装配置涉及php.ini配置文件的修改. 1 首先需要下载Xdebug,根据安装的PHP版本,选择合适的Xdebug版本, 2 安装Xdebug将下载的php_xdebu ...