Python学习【魔术方法】

2023-01-31 01:01:16 学习 方法 魔术

魔术方法

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

相关文章