Python运算符重载的简单实例代码

 更新时间:2022年01月09日 09:16:27   作者:慵懒之龟  
什么是运算符重载,就是让自定义的类生成的对象(实例)能够使用运算符进行操作,这篇文章主要给大家介绍了关于Python运算符重载的相关资料,需要的朋友可以参考下

什么是运算符重载

让自定义的类生成的对象(实例)能够使用运算符进行操作

作用:

让自定义的实例像内建对象一样进行运算符操作

让程序简洁易读

对自定义对象将运算符赋予新的规则

算术运算符的重载:

            方法名                  运算符和表达式      说明
            __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)

总结

到此这篇关于Python运算符重载的文章就介绍到这了,更多相关Python运算符重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决yum对python依赖版本问题

    解决yum对python依赖版本问题

    这篇文章主要介绍了解决yum对python依赖版本问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python实现查找所有程序的安装信息

    python实现查找所有程序的安装信息

    本文给大家分享的是使用python通过注册表信息实现快速查找windows应用程序的安装信息的方法和代码示例,有需要的小伙伴可以参考下
    2020-02-02
  • 我喜欢你 抖音表白程序python版

    我喜欢你 抖音表白程序python版

    我喜欢你!这篇文章主要为大家详细介绍了抖音表白程序python版的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Python如何使用BeautifulSoup爬取网页信息

    Python如何使用BeautifulSoup爬取网页信息

    这篇文章主要介绍了Python如何使用BeautifulSoup爬取网页信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • python怎么删除缓存文件

    python怎么删除缓存文件

    在本篇文章里小编给大家整理的是一篇关于python删除缓存文件方法,需要的朋友们可以学习下。
    2020-07-07
  • Python+unittest+requests 接口自动化测试框架搭建教程

    Python+unittest+requests 接口自动化测试框架搭建教程

    这篇文章主要介绍了Python+unittest+requests 接口自动化测试框架搭建教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Django实现前后端登录

    Django实现前后端登录

    这篇文章主要介绍了Django实现前后端登录的示例,帮助大家更好的理解和学习使用Django,感兴趣的朋友可以了解下
    2021-04-04
  • Python中多个数组行合并及列合并的方法总结

    Python中多个数组行合并及列合并的方法总结

    下面小编就为大家分享一篇Python中多个数组行合并及列合并的方法总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python学生信息管理系统修改版

    Python学生信息管理系统修改版

    这篇文章主要为大家详细介绍了python学生信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python实现汽车管理系统

    python实现汽车管理系统

    这篇文章主要为大家详细介绍了python实现汽车管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论