总结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使用函数默认值实现函数静态变量的方法
Aug 18 Python
对于Python的Django框架使用的一些实用建议
Apr 03 Python
python数据结构之图的实现方法
Jul 08 Python
详解python之简单主机批量管理工具
Jan 27 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
Python OpenCV对本地视频文件进行分帧保存的实例
Jan 08 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 Python
Django实现列表页商品数据返回教程
Apr 03 Python
Python3.9.1中使用match方法详解
Feb 08 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
Python常见字典内建函数用法示例
2018/05/14 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
pycharm创建一个python包方法图解
2019/04/10 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
八年级生物教学反思
2014/01/22 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
警校毕业生自我评价
2014/04/06 职场文书
刊首寄语大全
2014/04/11 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
梅花魂教学反思
2014/04/25 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
2014年档案室工作总结
2014/12/01 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
浅谈Python类的单继承相关知识
2021/05/12 Python