Python运算符重载的简单实例代码
作者:慵懒之龟 发布时间:2021-02-13 11:21:22
什么是运算符重载
让自定义的类生成的对象(实例)能够使用运算符进行操作
作用:
让自定义的实例像内建对象一样进行运算符操作
让程序简洁易读
对自定义对象将运算符赋予新的规则
算术运算符的重载:
方法名 运算符和表达式 说明
__add__(self,rhs) self + rhs 加法
__sub__(self,rhs) self - rhs 减法
__mul__(self,rhs) self * rhs 乘法
__truediv__(self,rhs) self / rhs 除法
__floordiv__(self,rhs) self //rhs 地板除
__mod__(self,rhs) self % rhs 取模(求余)
__pow__(self,rhs) self **rhs 幂运算
以__pow__为例
class Achievement(object):
def __init__(self,achievement):
self.achievement=achievement
def __pow__(self,other):
return self.achievement**other.achievement
achievement01=Achievement(20)
achievement02=Achievement(20)
print(pow(achievement01,achievement02))
打印输出的便是两个成绩的乘方104857600000000000000000000,其他运算符重载的基本步骤和__pow__大致相同。
python 3 的版本中已经没有cmp函数,被operator模块代替,在交互模式下使用时,需要导入模块。
import operator
operator.le(a, b)
operator.eq(a, b)
operator.ne(a, b)
operator.ge(a, b)
operator.gt(a, b)
operator.__lt__(a, b)
operator.__le__(a, b)
operator.__eq__(a, b)
operator.__ne__(a, b)
operator.__ge__(a, b)
operator.__gt__(a, b)
这几个函数就是用来替换之前的cmp的,先简单说下这几个函数的意思吧
lt(a,b) 相当于 a<b 数字或字母(ASCII)比大小
le(a,b)相当于a<=b
eq(a,b)相当于a==b 字母完全一样,返回True,
ne(a,b)相当于a!=b
gt(a,b)相当于a>b
ge(a,b)相当于 a>=b
函数的返回值是布尔类型
但是我们可以用运算符重载来复现cmp的功能
例:
class Achievement(object):
def __init__(self,achievement01,achievement02):
self.achievement01=achievement01
self.achievement02=achievement02
def cmp(self):
if self.achievement01>self.achievement02:
print(self.achievement01,">",self.achievement02)
return 1
elif self.achievement01<self.achievement02:
print(self.achievement01,"<",self.achievement02)
return -1
elif self.achievement01==self.achievement02:
print(self.achievement01,"=",self.achievement02)
return 0
main.py:
from demo01 import *
def main():
Achievement01=Achievement(100,50)
Achievement01.cmp()
if __name__=="__main__":
main()
上述例子中我在成绩类中写了一个cmp函数,因为python3中已经弃用了cmp函数,所以我们完全可以不按照标准的运算符重载写成__cmp__,直接函数名cmp即可,这样我们就又可以使用cmp函数了。
在主函数中传入成绩100和50,调用cmp函数,输出结果为100>50
反向运算符的重载
当运算符的左侧为内建类型时,右侧为自定义类型进行算术匀算符运算时会出现TypeError错误,因为无法修改内建类型的代码 实现运算符重载,此时需要使用反向运算符的重载
反向算术运算符的重载:
方法名 运算符和表达式 说明
__radd__(self,lhs) lhs + self 加法
__rsub__(self,lhs) lhs - self 减法
__rmul__(self,lhs) lhs * self 乘法
__rtruediv__(self,lhs) lhs / self 除法
__rfloordiv__(self,lhs) lhs // self 地板除
__rmod__(self,lhs) lhs % self 取模(求余)
__rpow__(self,lhs) lhs ** self 幂运算
示例:
class Mylist:
def __init__(self, iterable=()):
self.data = list(iterable)
def __repr__(self):
return 'Mylist(%s)' % self.data
def __add__(self, lst):
print('__add__被调用')
return Mylist(self.data + lst.data)
def __mul__(self, rhs):
# rhs为int类型,不能用rhs.data
print('__mul__被调用')
return Mylist(self.data * rhs)
def __rmul__(self, lhs):
print("__rmul__被调用")
return Mylist(self.data * lhs)
L1 = Mylist([1, 2, 3])
L2 = Mylist([4, 5, 6])
L3 = 3 * L1
print(L3)
L1 += L2
print(L1)
L2 *= 3
print(L2)
来源:https://blog.csdn.net/weixin_51803729/article/details/122361880


猜你喜欢
- 在Google Chrome浏览器出来之前,我一直使用FireFox,因为FireFox的插件非常丰富,更因为FireFox有强大的Fire
- plt.plot()函数各参数解析plt.plot()函数的作用是绘制折线图,它的参数有很多,常用的函数参数如下:plt.plot(x,y,
- 题目描述:给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数样例:给出链表1->2->3->4-&g
- 目录概述语法一、创建和初始化切片make字面量二、使用切片赋值和切片切片增长遍历切片总结总示例示例一 两个slice是否相等示例
- 本文实例讲述了python中pycurl库的用法,分享给大家供大家参考。该实例代码实现从指定网址读取网页,主要是pycurl库的使用。具体实
- 本文利用 MySQL的扩展功能 REPLACE INTO 来生成全局id,REPLACE INTO和INSERT的功能一样,但是当使用REP
- 在实际的机器学习项目中,我们通常需要将训练好的模型保存到磁盘,以便在以后的时间点进行推理或重新训练。同样地,我们也需要从磁盘加载模型以供使用
- go 简洁的并发多核处理器越来越普及。有没有一种简单的办法,能够让我们写的软件释放多核的威力?是有的。随着Golang, Erlang, S
- 回文数字是很有意思的数字,不管从最高位开始念,还是从个位开始念,最终结果都一样,有一种对称美。下面是回文数字的函数判断方式:def is_p
- 原因: __str__()这个特殊方法将对象转换为字符串的结果效果图:代码:# 定义一个Person类class Person(o
- 可怜我的C盘本来只有8.XG,所以不得不卸载掉它。卸载掉本身没啥问题,只是昨晚突然发现 Sql Server 2008 R2 Managem
- 本文主要是总结利用tensorflow实现迁移学习的基本步骤。所谓迁移学习,就是将上一个问题上训练好的模型通过简单的调整使其适用于一个新的问
- 正确的安装1、先安装packagingpython3 -m pip install packaging执行这个命令后会提示这样安装成功Def
- 本文实例讲述了Python中的is和id用法。分享给大家供大家参考。具体分析如下:(ob1 is ob2) 等价于 (id(ob1) ==
- 前几天安装Python的时候没有装上pip工具,所以只能现在手动安装了。首先,访问https://bootstrap.pypa.io/get
- 效果知识点:css3画气球, 自定义属性运用,随机阵列, DOM元素操作,高级回调函数与参数复传,动态布局,鼠标事件,定时器运用,CSS3新
- 1、生成 servie.yaml1.1、yaml转jsonservice模板yamlapiVersion: v1kind: Servicem
- 一、前提解决ES5中只有全局作用域和函数作用域,没有块级作用域而带来的不合理的场景。let基本用法用法和var 一样,只是let声明的变量只
- 前言写过前端Javascript代码的同学肯定不会对console对象感到陌生,在调试的过程中我们经常会用console对象在控制台输出一些
- 一、在访客的内心深处做导航我讨厌迷失,不管是在道路上或是在线网络上。猜想一下?您的访客也是这样的。就像我们期望看到的道路上的路标一样,来帮助