引言

有些事情让我不安,比如运算符重载。我决定不支持运算符重载,这完全是个人选择,因为我见过太多 C++ 程序员滥用它——James Gosling(Java 之父)

ps: 运算符重载它不香吗

写在前面

对于复利公式,在python中只需要

interest = principal * ((1 + rate) ** periods - 1)

其中periods是整数, rateinterestprincipal是精确的数字(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何时不等

xdecimal.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 章 正确重载运算符相关推荐

  1. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  2. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  3. python cookbook 豆瓣_学习python求推荐一波书籍?

    豆瓣最受好评的20本Python书 No.1 Fluent Python(豆瓣评分:9.6)Many programmers who learn Python basics fall into the ...

  4. python 查看变量_剖析python运算符is和==的区别

    is和==这两个运算符一直是困扰python的初学者,它们都可以用来判断某个对象是否是某个值,那么到底什么时候用is,什么时候用==去判断某个对象是否是某个值哪?下面勇哥结合实例给大家分享下两者的区别 ...

  5. python中运算符优先级_介绍python中运算符优先级

    原标题:介绍python中运算符优先级 下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合).这意味着在一个表达式中,Python会首先计算表中较下面 ...

  6. 用python学编程_用Python学编程

    第1部分 引 论 第1章 关于本书 1.1 什么人要学编程 1.2 本书的内容 1.3 为什么选择Python 1.4 如何阅读本书 1.5 本书内容的组织 第2章 学习编程的要求 2.1 关于编程者 ...

  7. 图解python专业教程_图解Python视频教程(基础篇)课程

    第2章HelloWorld:第一个Python程序 2-1在Windows操作系统中安装Python 2-2在MacOS操作系统中安装Python 2-3在Ubuntu操作系统中安装Python 2- ...

  8. python 免费空间_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  9. python培训班-Python培训机构_高品质Python线下开发培训班推荐-黑马程序员

    Python编程基础基础班1 课时:15天技术点:97项测验:2次学习方式:线下面授 学习目标 1.掌握Python开发环境基本配置|2.掌握运算符.表达式.流程控制语句.数组等的使用|3.掌握字符串 ...

最新文章

  1. iOS显示gif图片的几种方法
  2. 嘿,开发者,你的坑,我来填!
  3. 数据清理最终实现了自动化
  4. Spring AOP方法分析
  5. 18.外部相机校准——介绍,几何相机校正,自由度 测验,刚体变换,符号_1
  6. 【转】Oracle 系统权限详细列表
  7. python第6天作业
  8. 10 年前的我 VS 10 年后的我
  9. Acrobat Pro DC 教程,如何将演示文稿转换为 PDF 文件?
  10. 比特币交易的脚本如何执行
  11. python playsound播放时关闭_Python3 超好用的音频播放模块 playsound
  12. WeCenter 文件目录结构
  13. 超级牛的网站同步工具软件—端端Clouduolc
  14. python编程基础及应用(重庆大学):7-7 计算用户输入句子中的单词数量以及单词平均长度
  15. 又一个充电宝改装,经验升级版。
  16. 有哪些办法可以将ip地址更换?
  17. springboot添加切面
  18. 疫情期间居家所需物品清单
  19. 贝尔商道赚钱思维36道第12道:养成微习惯
  20. 基于GUI的学生成绩管理系统

热门文章

  1. 【zookeeper】zookeeper 启动 源码解读
  2. 【FLink】四种图 以及 数据在 taskManager 之间的流转
  3. 【Elasticsearch】玩转 Elasticsearch 7.8 的 SQL 功能
  4. Flink :刷屏 forceKillApplication over null,Retrying immediately The Client is Stopped
  5. Spring : spring的aware
  6. Spring : @EnableAutoConfiguration注解
  7. CGLI 报错 :VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit
  8. Maven: NoSuchMethodError fasterxml.jackson.core强行指定,无法排除
  9. typora设置代码不自动换行
  10. MySQL之索引的创建和删除