Python学习【魔术方法】

发布时间:2019-07-31 09:40:57编辑:auto阅读(1347)

    魔术方法

    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

关键字

上一篇: Python3 Selenium+Chr

下一篇: Python之列表