流畅的python笔记(十三)正确重载运算符

本文详细介绍了Python中运算符重载的规则和限制,包括一元运算符、向量加法、标量乘法、比较运算符和增量赋值运算符的实现。特别讨论了在向量类中如何实现加法和乘法运算符,以及如何处理不同类型的运算数。同时,还探讨了运算符重载在处理不同上下文和类型兼容性时的注意事项。

目录

一、运算符重载基础

二、一元运算符

- + ~ abs()

x和+x何时不相等

与decimal.Decimal类有关的情况

与collections.Counter有关的情况

三、重载向量加法运算符+

四、重载标量乘法运算符*

五、比较运算符

六、增量赋值运算符


一、运算符重载基础

python对运算符重载加了一些限制。

  • 不能重载内置类型的运算符
  • 不能新键运算符,只能重载现有的
  • 某些运算符不能重载------is、and、or、not(位运算符&、|、~可以)

二、一元运算符

- + ~ abs()

一元运算符比如 - + ~等,每个一元运算符都对应一个特殊方法,abs()函数也是一元运算符,对应的特殊方法是__abs__。支持一元运算符只需要实现相应的特殊方法即可,这些特殊方法只有一个参数self。运算符基本规则:始终返回一个新对象,即不能修改self。即便是+,最好也是返回一个副本,不能返回引用。

 

  1.  为了计算-v,构建一个新的Vector实例,把self的每个分量都取反。
  2.  为了计算+v,构建一个新的Vector实例,传入self的各个分量。

x和+x何时不相等

与decimal.Decimal类有关的情况

  1. decimal.getcontext获取当前全局算术运算的上下文引用
  2. 把算术运算上下文的精度设为40
  3. 使用当前精度计算1/3
  4. 查看结果,小数点后有40个数字
  5. one_third == +one_third返回True
  6. 把精度降低为28,这是python3.4为Decimal算术运算设定的默认精度
  7. 现在,one_third == +one_third返回False
  8. 查看+one_third,小数点后有28个数字

one_third小数点后边始终有40个数字,第一个+one_third表达式返回的结果小数点后边也有40个数字,而第二个+one_third表达式返回结果的时候,当前算术运算上下文的精度已经变了,因此返回结果后边只有28个表达式,因此与one_third不同了。

与collections.Counter有关的情况

Counter实现了中缀运算符+,作用是把两个Counter的实例加一起,但是相加之后的结果会剔除掉零值和负值。对于Counter,一元运算符+等同于加上一个空Counter,因此会产生一个新的Counter且仅保留大于零的计数器。

三、重载向量加法运算符+

这一小节中的+是中缀运算符。

对于序列类型,+一般用于拼接,而*用于重复复制。但对于向量的说应该用向量加法才对。

如果两个Vector实例长度不同,则用零填充较短的向量。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值