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实现的百度贴吧网络爬虫实例
Apr 17 Python
python如何在循环引用中管理内存
Mar 20 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python中整数的缓存机制讲解
Feb 16 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
Django中F函数的使用示例代码详解
Jul 06 Python
利用Python实现斐波那契数列的方法实例
Jul 26 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 Python
Python办公自动化PPT批量转换操作
Sep 15 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程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
7个JS基础知识总结
2014/03/05 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
python 不关闭控制台的实现方法
2011/10/23 Python
Python中自定义函数的教程
2015/04/27 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
python如何爬取个性签名
2018/06/19 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
服装机修工岗位职责
2013/12/26 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
妇联主席先进事迹
2014/05/18 职场文书
设备售后服务承诺书
2014/05/30 职场文书
个人承诺书格式
2014/06/03 职场文书
2014年体育部工作总结
2014/11/13 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP