总结Python常用的魔法方法


Posted in Python onMay 25, 2021

一、算数运算符的魔法方法

  • python2.2以后,对类和类型进行了统一,做法就是讲int()、float()、str()、list()、tuple()这些BIF转换为工厂函数(类对象)
  • 给出以下算数运算符对应的魔法方法,前面和后面都被双下划线包尾说明是魔法方法
运算符 对应的魔法方法 中文注释
+ __ add__(self, other) 加法
- __ sub__(self, other) 减法
* __ mul__(self, other) 乘法
/ __ truediv__(self, other) 真除法
// __ floordiv__(self, other) 整数除法
% __ mod__(self, other) 取余除法
divmod(a, b) __ divmod__(self, other) 把除数和余数运算结果结合,divmod(a,b)返回值是一个元组(a//b, a%b)
** __ pow__(self, other[,modulo]) self的other次方再对modulo取余
<< __ lshift__(self, other) 按位左移
>> __ rshift__(self, other) 按位右移
& __ and__(self, other) 按位与操作
^ __ xor__(self, other) 按位异或操作(同为0,异为1)
__ or__(self, other) 按位或操作(有1则1)
? ? ?
  • eg:
>>> type(len)
<class 'builtin_function_or_method'>            #普通的BIF
>>> type(int)
<class 'type'>             #工厂函数(类对象),当调用它们的时候,其实就是创建了一个相应的实例对象
>>> type(dir)
<class 'builtin_function_or_method'>
>>> type(list)
<class 'type'>

>>> a = int('123')        #创建一个相应的实例对象a
>>> b = int('345')
>>> a + b              #python在两个对象进行相加操作
468
  • eg:举个例子,下面定义一个比较特立独行的类:

继承int,并重写__add__方法

>>> class New_int(int):
    def __add__(self,other):
        return int.__sub__(self,other)
    def __sub__(self,other):
        return int.__add__(self,other)

    
>>> a = New_int(3)
>>> b = New_int(5)
>>> a + b    #两个对象相加,触发 __add__(self,other)方法
-2
>>> a - b
8
>>>

实例2:错误写法,会造成无限递归
>>> class New_int(int):
    def __add__(self,other):
        return (self + other)  
    def __sub__(self,other):
        return (self - other)


>>> class New_int(int):
    def __add__(self,other):
        return (int(self) + int(other))       #将self与other强制转换为整型,所以不会出现两个对象相加触发__add__()方法
    def __sub__(self,other):
        return (int(self) - int(other))

    
>>> a = New_int(3)
>>> b = New_int(5)
>>> a + b
8

二、反运算相关的魔法方法

  • 反运算相关的魔法方法
魔法方法 定义
__ radd__(self, other) 定义加法的行为:+(当左操作数不支持相应的操作时被调用)
__ rsub__(self, other) 定义减法的行为:-(当左操作数不支持相应的操作时被调用)
__ rmul__(self, other) 定义乘法的行为:*(当左操作数不支持相应的操作时被调用)
__ rtruediv__(self, other) 定义真除法的行为:/(当左操作数不支持相应的操作时被调用)
__ rfloordiv__(self, other) 定义整数除法的行为://(当左操作数不支持相应的操作时被调用)
__ rmod__(self, other) 定义取模算法的行为:%(当左操作数不支持相应的操作时被调用)
__ rdivmod__(self, other) 定义当被divmod()调用时的行为(当左操作数不支持相应的操作时被调用)
__ rpow__(self, other) 定义当被power()调用或**运算时的行为(当左操作数不支持相应的操作时被调用)
__ rlshift__(self, other) 定义按位左移位的行为:<<(当左操作数不支持相应的操作时被调用)
__ rrshift__(self, other) 定义按位右移位的行为:>>(当左操作数不支持相应的操作时被调用)
__ rand__(self, other) 定义按位与操作的行为:&(当左操作数不支持相应的操作时被调用)
__ rxor__(self, other) 定义按位异或操作的行为:^(当左操作数不支持相应的操作时被调用)
__ ror__(self, other) 定义按位或操作的行为:丨(当左操作数不支持相应的操作时被调用)
? ?
>>> class int(int):
    def __add__(self,other):
        return int.__sub__(self,other)

    
>>> a = int(3)
>>> b = int(2)
>>> a + b
1

反运算与算术运算符的不同之处是,反运算多了一个'r',例如 __add__()的反运算对应为 __radd__()

>>> a + b

这里a是加数,b是被加数,如果a对象的__add__()方法没有实现或者不支持相应的操作,那么python就会自动调用b的__radd__()方法

实例:

>>> class Nint(int):
    def __radd__(self,other):
        return int.__sub__(self,other)

    
>>> a = Nint(5)
>>> b = Nint(3)
>>> a + b      #由于a对象默认有__add__()方法,所以b的__radd__()没有执行
8

实例2:

>>> class Nint(int):
    def __radd__(self,other):
        return int.__sub__(self,other)

    
>>> b = Nint(5)
>>> 3 + b         #由于3无__add__()方法,所以执行b的反运算__radd__(self,other)方法,其中self是b对象
2

eg:注:在重写反运算魔法方法时,一定要注意顺序问题。得到的应该是个负数,所以顺序改变下。

总结Python常用的魔法方法 

三、增量赋值运算

增量赋值运算的魔法方法

魔法方法 定义
__ iadd__(self, other) 定义赋值加法的行为:+=
__ isub__(self, other) 定义赋值减法的行为:-=
__ imul__(self, other) 定义赋值乘法的行为:*=
__ itruediv__(self, other) 定义赋值真除法的行为:/=
__ ifloordiv__(self, other) 定义赋值整数除法的行为://=
__ imod__(self, other) 定义赋值取模算法的行为:%=
__ ipow__(self, other) 定义赋值幂运算的行为:**=
__ ilshift__(self, other) 定义赋值按位左移位的行为:<<=
__ irshift__(self, other) 定义赋值按位右移位的行为:>>=
__ iand__(self, other) 定义赋值按位与操作的行为:&=
__ ixor__(self, other) 定义赋值按位异或操作的行为:^=
__ ior__(self, other) 定义赋值按位或操作的行为:丨=
- -

四、一元操作符

  • 一元操作符的魔法方法
魔法方法 定义
__ neg__(self) 定义正号的行为:+x
__ pos__(self) 定义负号的行为:-x
__ abs__(self) 定义当被abs()调用时的行为
__ invert__(self) 定义按位求反的行为:~x
? ?

到此这篇关于总结Python常用的魔法方法的文章就介绍到这了,更多相关Python魔法方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
Python 中 list 的各项操作技巧
Apr 13 Python
Python探索之Metaclass初步了解
Oct 28 Python
实例详解Matlab 与 Python 的区别
Apr 26 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
python中从for循环延申到推导式的具体使用
Nov 29 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 Python
Python+Appium自动化测试的实战
Jun 30 Python
Python入门学习之类的相关知识总结
python munch库的使用解析
May 25 #Python
python调试工具Birdseye的使用教程
浅谈Python numpy创建空数组的问题
May 25 #Python
python实现语音常用度量方法的代码详解
python基础学习之生成器与文件系统知识总结
May 25 #Python
Python实战之实现简易的学生选课系统
May 25 #Python
You might like
用PHP开发GUI
2006/10/09 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
php实现图片缩略图的方法
2016/03/29 PHP
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
js闭包用法实例详解
2016/12/13 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
AngularJS 应用模块化的使用
2018/04/04 Javascript
python使用urllib模块开发的多线程豆瓣小站mp3下载器
2014/01/16 Python
Python的pycurl包用法简介
2015/11/13 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python 的topk算法实例
2020/04/02 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
物流仓储实习自我鉴定
2013/09/25 职场文书
市场拓展计划书
2014/05/03 职场文书
法务专员岗位职责
2015/02/14 职场文书
财务个人年度总结范文
2015/02/26 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js