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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 本文实例讲述了Python使用matplotlib绘图无法显示中文问题的解决方法。分享给大家供大家参考,具体如下:在python中,默认情况
- Python个人博客程序开发实例框架设计中,我们已经完成了 数据库设计、数据准备、模板架构、表单设计、视图函数设计、电子邮件支持 等总体设计
- 想做个和IBM公司一样的网站LOGO,试了半天也没有做出来,郁闷之下,只好求高手帮助!先在这里谢谢了!方法一1、写上IBM,调节字号颜色2、
- 一下文件执行将产生乱码,切.log文件显示问好,打不开import loggingdef shop_logging(name):  
- 一、安装SSL证书的环境Apache安装目录:E:phpStudyPHPTutorialApache以上为windows下测试SSL证书安装
- Form介绍在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多
- 回收站(Recycle Bin)从原理上来说就是一个数据字典表,放置用户删除(drop)掉的数据库对象信息。用户进行删除操作的对象并没有被数
- 找了国内30个比较著名的网站的注册表单做样本,对标签和输入区对齐方式做了统计,得到了一个结论:标签水平右对齐更适合中文网站,或者说右对齐更适
- Oracle提供了不少方法用于数据空间的使用、监控和维护,同时也在各版本中陆续对这方面的功能进行了增强,目的在于简化这方面工作的复杂度,提高
- 年月日三下拉框联动,代码比较简洁<html><head><title>年月日三下拉框联动 - www.a
- 使用环境:人才网项目中有一个简历保密设置,其中有一个过滤关键词,只有某个企业的公司名中包含有其中的一个关键字,就不显示该份简历,当然,我还没
- 在这篇文章中,将向您展示如何使用Python链接目前主流的MongoDB(V3.4.0)数据库,主要使用PyMongo(v3.4.0)和Mo
- 题目描述输入一行或多行字符串密码,验证每行密码是否符合规范,符合提示“OK”,否则“NG”。密码规范为:1.长度超过8位2.包括大小写字母.
- requests 是一个非常小巧全面的库,应用它可以很容易写出与服务器进行交互的程序,今天遇到了一个问题,与服务器交互时,url都是http
- 很多网站登录登陆时都要用到滑块验证码,在某些场景例如使用爬虫爬取信息时常常受到阻碍,想着用opencv的模板匹配试试能不能实现模拟登陆。本来
- PHP get_html_translation_table() 函数实例输出 htmlspecialchars 函数使用的翻译表:<
- 本文实例讲述了Python实现的数据结构与算法之快速排序。分享给大家供大家参考。具体分析如下:一、概述快速排序(quick sort)是一种
- 方法 bindParam() 和 bindValue() 非常相似。 唯一的区别就是前者使用一个PHP变量绑定参数,而后者使用一个值。 所以
- 本案例使用 Jupyter Notebook进行案例演示,数据集为NBA球员信息数据集。本项目将进行完整的数据分析演示。1. 数据介绍数据集
- Sys.path 指定用于模块搜索路径的字符串列表也可以通过sys模块的append方法在Python环境中增加搜索路径。Sys.path.