Python魔法方法详解


Posted in Python onFebruary 13, 2019

据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切。

他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。

Python 的魔术方法非常强大,然而随之而来的则是责任。了解正确的方法去使用非常重要!

魔法方法

含义

基本的魔法方法

__new__(cls[, ...])

  1. new 是在一个对象实例化的时候所调用的第一个方法
  2. 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法
  3. new 决定是否要使用该 init 方法,因为 new 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 new 没有返回实例对象,则 init 不会被调用
  4. new 主要是用于继承一个不可变的类型比如一个 tuple 或者 string__init__(self[, ...]) 构造器,当一个实例被创建的时候调用的初始化方法

__del__(self) 析构器,当一个实例被销毁的时候调用的方法

__call__(self[, args...]) 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__(a, b)

__len__(self) 定义当被 len() 调用时的行为

__repr__(self) 定义当被 repr() 调用时的行为

__str__(self) 定义当被 str() 调用时的行为 类似于Java中toString方法

__bytes__(self) 定义当被 bytes() 调用时的行为

__hash__(self) 定义当被 hash() 调用时的行为

__bool__(self) 定义当被 bool() 调用时的行为,应该返回 True 或 False

__format__(self, format_spec) 定义当被 format() 调用时的行为

有关属性

__getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为

__getattribute__(self, name) 定义当该类的属性被访问时的行为

__setattr__(self, name, value) 定义当一个属性被设置时的行为

__delattr__(self, name) 定义当一个属性被删除时的行为

__dir__(self) 定义当 dir() 被调用时的行为

__get__(self, instance, owner) 定义当描述符的值被取得时的行为

__set__(self, instance, value) 定义当描述符的值被改变时的行为

__delete__(self, instance) 定义当描述符的值被删除时的行为

比较操作符

__lt__(self, other) 定义小于号的行为:x < y 调用 x.__lt__(y)

__le__(self, other) 定义小于等于号的行为:x <= y 调用 x.__le__(y)

__eq__(self, other) 定义等于号的行为:x == y 调用 x.__eq__(y)

__ne__(self, other) 定义不等号的行为:x != y 调用 x.__ne__(y)

__gt__(self, other) 定义大于号的行为:x > y 调用 x.__gt__(y)

__ge__(self, other) 定义大于等于号的行为:x >= y 调用 x.__ge__(y)

算数运算符

__add__(self, other) 定义加法的行为:+

__sub__(self, other) 定义减法的行为:-

__mul__(self, other) 定义乘法的行为:*

__truediv__(self, other) 定义真除法的行为:/

__floordiv__(self, other) 定义整数除法的行为://

__mod__(self, other) 定义取模算法的行为:%

__divmod__(self, other) 定义当被 divmod() 调用时的行为

__pow__(self, other[, modulo]) 定义当被 power() 调用或 ** 运算时的行为

__lshift__(self, other) 定义按位左移位的行为:<<

__rshift__(self, other) 定义按位右移位的行为:>>

__and__(self, other) 定义按位与操作的行为:&

__xor__(self, other) 定义按位异或操作的行为:^

__or__(self, other) 定义按位或操作的行为:|

反运算

__radd__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rsub__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rmul__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rtruediv__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rfloordiv__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rmod__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rdivmod__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rpow__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rlshift__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rrshift__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__rxor__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

__ror__(self, other) (与上方相同,当左操作数不支持相应的操作时被调用)

增量赋值运算

__iadd__(self, other) 定义赋值加法的行为:+=

__isub__(self, other) 定义赋值减法的行为:-=

__imul__(self, other) 定义赋值乘法的行为:*=

__itruediv__(self, other) 定义赋值真除法的行为:/=

__ifloordiv__(self, other) 定义赋值整数除法的行为://=

__imod__(self, other) 定义赋值取模算法的行为:%=

__ipow__(self, other[, modulo]) 定义赋值幂运算的行为:**=

__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

类型转换

__complex__(self) 定义当被 complex() 调用时的行为(需要返回恰当的值)

__int__(self) 定义当被 int() 调用时的行为(需要返回恰当的值)

__float__(self) 定义当被 float() 调用时的行为(需要返回恰当的值)

__round__(self[, n]) 定义当被 round() 调用时的行为(需要返回恰当的值)

__index__(self)

  1. 当对象是被应用在切片表达式中时,实现整形强制转换
  2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 index
  3. 如果 index 被定义,则 int 也需要被定义,且返回相同的值

上下文管理(with 语句)

__enter__(self)

1. 定义当使用 with 语句时的初始化行为
2. __enter__ 的返回值被 with 语句的目标或者 as 后的名字绑定

__exit__(self, exc_type, exc_value, traceback)

1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么
2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作

容器类型

__len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数)

__getitem__(self, key) 定义获取容器中指定元素的行为,相当于 self[key]

__setitem__(self, key, value) 定义设置容器中指定元素的行为,相当于 self[key] = value

__delitem__(self, key) 定义删除容器中指定元素的行为,相当于 del self[key]

__iter__(self) 定义当迭代容器中的元素的行为

__reversed__(self) 定义当被 reversed() 调用时的行为

__contains__(self, item) 定义当使用成员测试运算符(in 或 not in)时的行为

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python分割和拼接字符串
Nov 01 Python
python 写的一个爬虫程序源码
Feb 28 Python
Python实现两款计算器功能示例
Dec 19 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
pymongo中聚合查询的使用方法
Mar 22 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
使用python实现多维数据降维操作
Feb 24 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
用python制作个音乐下载器
Jan 30 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 Python
Python函数中不定长参数的写法
Feb 13 #Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 #Python
python调用c++传递数组的实例
Feb 13 #Python
利用ctypes获取numpy数组的指针方法
Feb 12 #Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 #Python
使用python绘制二元函数图像的实例
Feb 12 #Python
python matplotlib实现双Y轴的实例
Feb 12 #Python
You might like
php结合飞信 免费天气预报短信
2009/05/07 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
Python实现京东秒杀功能代码
2019/05/16 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
运动会入场式解说词
2014/02/18 职场文书
文明礼仪主题班会
2015/08/13 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
python和anaconda的区别
2022/05/06 Python
Android实现图片九宫格
2022/06/28 Java/Android