总结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获取网页状态码示例
Mar 30 Python
低版本中Python除法运算小技巧
Apr 05 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
基于Python新建用户并产生随机密码过程解析
Oct 08 Python
基于python3 的百度图片下载器的实现代码
Nov 05 Python
python3 实现口罩抽签的功能
Mar 11 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
python飞机大战游戏实例讲解
Dec 04 Python
python实现杨辉三角的几种方法代码实例
Mar 02 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汉字转拼音的示例
2014/02/27 PHP
微信支付开发发货通知实例
2016/07/12 PHP
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
js初始化验证实例详解
2016/11/26 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
总结js函数相关知识点
2018/02/27 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
python使用多进程的实例详解
2018/09/19 Python
opencv实现简单人脸识别
2021/02/19 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
PyQt实现计数器的方法示例
2021/01/18 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
文职个人求职信范文
2013/09/23 职场文书
给物业的表扬信
2014/01/21 职场文书
七年级音乐教学反思
2014/01/26 职场文书
学校捐书倡议书
2015/04/27 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
送给客户微信问候语!
2019/07/04 职场文书
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript