目录
一、运算符重载基础
python对运算符重载加了一些限制。
- 不能重载内置类型的运算符
- 不能新键运算符,只能重载现有的
- 某些运算符不能重载------is、and、or、not(位运算符&、|、~可以)
二、一元运算符
- + ~ abs()
一元运算符比如 - + ~等,每个一元运算符都对应一个特殊方法,abs()函数也是一元运算符,对应的特殊方法是__abs__。支持一元运算符只需要实现相应的特殊方法即可,这些特殊方法只有一个参数self。运算符基本规则:始终返回一个新对象,即不能修改self。即便是+,最好也是返回一个副本,不能返回引用。


- 为了计算-v,构建一个新的Vector实例,把self的每个分量都取反。
- 为了计算+v,构建一个新的Vector实例,传入self的各个分量。
x和+x何时不相等
与decimal.Decimal类有关的情况

- decimal.getcontext获取当前全局算术运算的上下文引用
- 把算术运算上下文的精度设为40
- 使用当前精度计算1/3
- 查看结果,小数点后有40个数字
- one_third == +one_third返回True
- 把精度降低为28,这是python3.4为Decimal算术运算设定的默认精度
- 现在,one_third == +one_third返回False
- 查看+one_third,小数点后有28个数字
one_third小数点后边始终有40个数字,第一个+one_third表达式返回的结果小数点后边也有40个数字,而第二个+one_third表达式返回结果的时候,当前算术运算上下文的精度已经变了,因此返回结果后边只有28个表达式,因此与one_third不同了。
与collections.Counter有关的情况
Counter实现了中缀运算符+,作用是把两个Counter的实例加一起,但是相加之后的结果会剔除掉零值和负值。对于Counter,一元运算符+等同于加上一个空Counter,因此会产生一个新的Counter且仅保留大于零的计数器。

三、重载向量加法运算符+
这一小节中的+是中缀运算符。
对于序列类型,+一般用于拼接,而*用于重复复制。但对于向量的说应该用向量加法才对。

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

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

被折叠的 条评论
为什么被折叠?



