python 运算符重载_《fluent python》第 13 章 正确重载运算符
引言
有些事情让我不安,比如运算符重载。我决定不支持运算符重载,这完全是个人选择,因为我见过太多 C++ 程序员滥用它——James Gosling(Java 之父)
ps: 运算符重载它不香吗
写在前面
对于复利公式,在python中只需要
interest = principal * ((1 + rate) ** periods - 1)
其中periods
是整数, rate
、interest
和principal
是精确的数字(Python 中decimal.Decimal
类的实例)
但是在Java
中,如果把float
换成精度不定的BigDecimal
,就无法再使用中缀运算符,因为中缀运算符只支持基本类型。用过java大数类的都知道会写吐的:
BigDecimal interest = principal.multiply(BigDecimal.ONE.add(rate).pow(periods).subtract(BigDecimal.ONE));
Python禁止重载内置类型的运算符
python支持的运算符
一元运算符
- (__neg__)
, 取负运算符+ (__pos__)
, 取正运算符~ (__invert__)
, 取反运算符
一元运算符要遵守运算符的一个基本规则:始终返回一个新对象
x
和+x
何时不等
当x
是decimal.Decimal
实例子时,由于+
运算返回新的实例,由于计算机存储浮点数的原因可能会导致偏差, 所以导致内容不等, 即x != +x
ps: 一般比较两个浮点数都要设置一个精度来判别
重载加法运算符+
和乘法运算符*
为了支持涉及不同类型的运算,Python为中缀运算符特殊方法提供了特殊的分派机制
。对 表达式a + b
来说,解释器会执行以下几步操作
- 如果
a
有__add__
方法,而且返回值不是NotImplemented
,调用a.__add__(b)
,然后返回结果。 - 如果
a
没有__add__
方法,或者调用__add__
方法返回NotImplemented
,检查b
有没有__radd__
方法,如果有,而且没有返回NotImplemented
,调用b.__radd__(a)
,然后返回结果。 - 如果
b
没有__radd__
方法,或者调用__radd__
方法返回NotImplemented
,抛出TypeError
,并在错误消息中指明操作数类型不支持。
注意
- 实现一元运算符和中缀运算符的特殊方法一定
不能修改操作数
。使用这些运算符的表达式期待结果是新对象
- 如果由于类型不兼容而导致运算符特殊方法无法返回有效的结果,那么应该返回
NotImplemented
,而不是抛出TypeError
。返回 NotImplemented 时,另一个操作数所属的类型还有机会执行运算,即Python
会尝试调用反向方法。 - 为了遵守鸭子类型精神,我们不能测试
other
操作数(即右操作数)的类型,我们要捕获异常,然后返回NotImplemented
。如果解释器还未反转操作数,那么它将尝试去做。如果反向方法返回NotImplemented
,那么Python
会抛出TypeError
,并返回一个标准的错误消息,例如“unsupported operand type(s) for +: Vector and str”。
python3.5
支持中缀运算符@
(点积运算)
比较运算符
Python解释器对众多比较运算符(==
、!=
、>
、<
、>=
、<=
)的处理与前文类似,不过在两个方面有重大区别。正向和反向调用使用的是同一系列方法。如图所示
Python在object
基类中通过__ne__
方法为!=
提供了便利的实现
增量赋值运算符
None
写在最后
我不能体会之前说的少用isinstance()
去判断参数类型转而去拥抱鸭子类型
,这有什么区别吗?反而我觉得用isinstance()
会更显式
, 而像鸭子类型
那样try...except..
反而更隐式
python 运算符重载_《fluent python》第 13 章 正确重载运算符相关推荐
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- python cookbook 豆瓣_学习python求推荐一波书籍?
豆瓣最受好评的20本Python书 No.1 Fluent Python(豆瓣评分:9.6)Many programmers who learn Python basics fall into the ...
- python 查看变量_剖析python运算符is和==的区别
is和==这两个运算符一直是困扰python的初学者,它们都可以用来判断某个对象是否是某个值,那么到底什么时候用is,什么时候用==去判断某个对象是否是某个值哪?下面勇哥结合实例给大家分享下两者的区别 ...
- python中运算符优先级_介绍python中运算符优先级
原标题:介绍python中运算符优先级 下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合).这意味着在一个表达式中,Python会首先计算表中较下面 ...
- 用python学编程_用Python学编程
第1部分 引 论 第1章 关于本书 1.1 什么人要学编程 1.2 本书的内容 1.3 为什么选择Python 1.4 如何阅读本书 1.5 本书内容的组织 第2章 学习编程的要求 2.1 关于编程者 ...
- 图解python专业教程_图解Python视频教程(基础篇)课程
第2章HelloWorld:第一个Python程序 2-1在Windows操作系统中安装Python 2-2在MacOS操作系统中安装Python 2-3在Ubuntu操作系统中安装Python 2- ...
- python 免费空间_用python做大数据
不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...
- python培训班-Python培训机构_高品质Python线下开发培训班推荐-黑马程序员
Python编程基础基础班1 课时:15天技术点:97项测验:2次学习方式:线下面授 学习目标 1.掌握Python开发环境基本配置|2.掌握运算符.表达式.流程控制语句.数组等的使用|3.掌握字符串 ...
最新文章
- iOS显示gif图片的几种方法
- 嘿,开发者,你的坑,我来填!
- 数据清理最终实现了自动化
- Spring AOP方法分析
- 18.外部相机校准——介绍,几何相机校正,自由度 测验,刚体变换,符号_1
- 【转】Oracle 系统权限详细列表
- python第6天作业
- 10 年前的我 VS 10 年后的我
- Acrobat Pro DC 教程,如何将演示文稿转换为 PDF 文件?
- 比特币交易的脚本如何执行
- python playsound播放时关闭_Python3 超好用的音频播放模块 playsound
- WeCenter 文件目录结构
- 超级牛的网站同步工具软件—端端Clouduolc
- python编程基础及应用(重庆大学):7-7 计算用户输入句子中的单词数量以及单词平均长度
- 又一个充电宝改装,经验升级版。
- 有哪些办法可以将ip地址更换?
- springboot添加切面
- 疫情期间居家所需物品清单
- 贝尔商道赚钱思维36道第12道:养成微习惯
- 基于GUI的学生成绩管理系统
热门文章
- 【zookeeper】zookeeper 启动 源码解读
- 【FLink】四种图 以及 数据在 taskManager 之间的流转
- 【Elasticsearch】玩转 Elasticsearch 7.8 的 SQL 功能
- Flink :刷屏 forceKillApplication over null,Retrying immediately The Client is Stopped
- Spring : spring的aware
- Spring : @EnableAutoConfiguration注解
- CGLI 报错 :VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit
- Maven: NoSuchMethodError fasterxml.jackson.core强行指定,无法排除
- typora设置代码不自动换行
- MySQL之索引的创建和删除