Python学习【魔术方法】
魔术方法
python中,所有以双下划线“__”包围的方法(即定义在类中的函数)为魔术方法Magic Method。
构造和初始化
在使用classname()创造实例化对象时,会依次执行__new__和__init__两个方法。
__new__是用来创建类并返回这个类的实例(一般)
__init__只是将传入的参数来初始化该实例,称为**构造方法**
__del__在释放对象时调用,称为**析构方法**
控制访问
__getattr__(self,item):访问不存在属性时调用的方法。(item为属性名)
__getattribute__(self,item):访问属性就会调用(无论item属性是否存在)。
object类中在getattribute方法中调用gettattr方法。
__setattr__(self, key, value):使用'='对属性(不存在则创建)进行赋值时调用的方法。
每次利用‘=’为对象的属性赋值时都会调用__setattr__方法。
所以该方法中不能出现self.key=value类似直接对对象属性进行赋值的语句,否则会产生无限递归。
如果要实现self.key=value的逻辑
可以采用self.__dict__[key]=value的方式,避免直接对属性赋值产生递归。
__delattr__:在删除属性时调用的方法。
自定义容器
Python内置的魔术方法,可以使得用户自定义的类具有与常见容器数据类型类似的行为特性。
常见容器数据类型包括(列表/元组/集合/字典/字符串等)
__len__(self):返回容器的长度。
__getitem__(self, key):利用索引访问容器内元素时调用的方法。(即self[key])
__setitem__(self, key, value):利用索引赋值时调用的方法。(即self[key]=value)
__delitem__(self, key):利用索引删除容器内元素时调用的方法。(即del self[key])
__iter__(self):返回一个迭代器,内置iter()进行调用或使用for循环遍历时调用,必须定义返回self的__iter__方法。
__reversed__(self):当调用reversed()时调用的方法,应返回有序序列的倒序。
__contains__(self, item):进行in 或not in时调用的方法,如果不定义会迭代容器中的元素来判断返回True或者False。
__missing__(self, key):key在容器中找不到时调用。(字典类型中含有该方法)
可调用对象
__call__(self, *args, **kwargs):当对象被作为函数进行调用时调用的方法。
上下文管理
with声明引入新的代码块
__enter__(self):with引入代码块开始时调用的方法。
返回值与with语句的目标或者as后的名字绑定
__exit__(self, exc_type, exc_val, exc_tb):代码块结束或被终止时调用的方法。
当代码块执行正常, exc_type, exc_val, exc_tb均为None。
深浅拷贝
__copy__(self):当对实例化对象进行copy.copy()时调用的方法。
浅拷贝是相当于引用原对象的数据,对浅拷贝对象数据的修改,会影响到原来的数据。
__deepcopy__(self, memodict={}):当对实例化对象进行copy.deepcopy()时调用的方法。
深拷贝是将对象及其数据全拷贝一份,对深拷贝对象数据的修改,不会影响原数据。
其他常见方法
用于比较的魔术方法
__cmp__(self, other) 是比较方法里面最基本的的魔法方法
__eq__(self, other) 定义相等符号的行为,==
__ne__(self,other) 定义不等符号的行为,!=
__lt__(self,other) 定义小于符号的行为,<
__gt__(self,other) 定义大于符号的行为,>
__le__(self,other) 定义小于等于符号的行为,<=
__ge__(self,other) 定义大于等于符号的行为,>=
数值计算的魔术方法
单目运算符和函数
__pos__(self) 实现一个取正数的操作
__neg__(self) 实现一个取负数的操作
__abs__(self) 实现一个内建的abs()函数的行为
__invert__(self) 实现一个取反操作符(~操作符)的行为
__round__(self, n) 实现一个内建的round()函数的行为
__floor__(self) 实现math.floor()的函数行为
__ceil__(self) 实现math.ceil()的函数行为
__trunc__(self) 实现math.trunc()的函数行为
双目运算符或函数
__add__(self, other) 实现一个加法
__sub__(self, other) 实现一个减法
__mul__(self, other) 实现一个乘法
__floordiv__(self, other) 实现一个“//”操作符产生的整除操作()
__div__(self, other) 实现一个“/”操作符代表的除法操作
__truediv__(self, other) 实现真实除法
__mod__(self, other) 实现一个“%”操作符代表的取模操作
__divmod__(self, other) 实现一个内建函数divmod()
__pow__ 实现一个指数操作(“**”操作符)的行为
__lshift__(self, other) 实现一个位左移操作(<<)的功能
__rshift__(self, other) 实现一个位右移操作(>>)的功能
__and__(self, other) 实现一个按位进行与操作(&)的行为
__or__(self, other) 实现一个按位进行或操作的行为
__xor__(self, other) __xor__(self, other)
增量运算
__iadd__(self, other) 加法赋值
__isub__(self, other) 减法赋值
__imul__(self, other) 乘法赋值
__ifloordiv__(self, other) 整除赋值,地板除,相当于 //= 运算符
__idiv__(self, other) 除法赋值,相当于 /= 运算符
__itruediv__(self, other) 真除赋值
__imod_(self, other) 模赋值,相当于 %= 运算符
__ipow__ 乘方赋值,相当于 **= 运算符
__ilshift__(self, other) 左移赋值,相当于 <<= 运算符
__irshift__(self, other) 左移赋值,相当于 >>= 运算符
__iand__(self, other) 与赋值,相当于 &= 运算符
__ior__(self, other) 或赋值
__ixor__(self, other) 异或运算符,相当于 ^= 运算符
类型转换
__int__(self) 转换成整型
__long__(self) 转换成长整型
__float__(self) 转换成浮点型
__complex__(self) 转换成 复数型
__oct__(self) 转换成八进制
__hex__(self) 转换成十六进制
__index__(self) 如果你定义了一个可能被用来做切片操作的数值型,你就应该定义__index__
__trunc__(self) 当 math.trunc(self) 使用时被调用__trunc__返回自身类型的整型截取
__coerce__(self, other) 执行混合类型的运算
参考博客:
https://www.cnblogs.com/pyxiaomangshe/p/7927540.html
Https://blog.csdn.net/may_xu_/article/details/81513170
相关文章