python-魔术方法
定义
Python的魔术方法是用于为我们自定义的类重写函数功能的方法
首先来看几个比较重要的
__getattribute__
这个方法会拦截所有企图对对象属性访问的动作,包括__dict__的访问,若不设置返回值会把None当作访问结果,但是不会拦截对类的属性访问,所以为了避免访问属性循环最好使用基类
但是只适用于新式类,就是集成自object或者type的类
1 | class man(object): |
当访问的属性不存在而且还重载了__getattribute__,那么他不会抛出AttributeError异常
__getattr__
执行条件有两个:
1.访问对象,
2.触发
AttributeError异常
也就是说属性存在时也可以触发
访问对象不存在的属性时触发了AttributeError因此会自动调用
重载了__getattribute__方法,却没有主动抛出AttributeError异常的机制或者抛出其它类型的异常,__getattr__方法都不会执行
1 | class man(object): |
1 | class man(object): |
__setattr__
为属性赋值自动触发,__init__初始化也会触发
如果先搞在这个方法中为属性赋值,需要用__dict__返回一个字典修改键值对,这样就不会反复循环了
self.__dict__[key]=value
但是如果此时还定义了__getattribute__那么在访问self.__dict__属性也会触发__getattribute__
此时我们可以采用self.__dict__={xxxxx}这样的赋值语句就不会触发__getattribute__
———————分割线————————
__get__
描述符方法用于将访问对象属性转化为调用描述符方法
1 | class Descriptor(object): |
__add__
1 | num+9 |
重写__add__实现字典组合
1 | class Dic(dict): |
__init__与__str__与__del__
__init__类的构造方法,类似于__construct
在类初始化时调用
__str__重写了print函数
__del__类的析构方法,类似于__destruct
在类在内存中释放时调用
1 | class Person: |
__repr__
用于重写repr()函数,返回对象信息,可以用于代替__str__
repr()在shell中直接回显
1 | class Person: |
剩下几个都很好理解了…..
__module__与__call__
__module__表示当前操作的对象在哪个模块
__call__当对象被当作函数调用触发
__len__与__getitem__
__len__返回容器的长度
__getitem__定义访问([])运算符
__int__与__index__
__int__重写int()函数
__index__在调用hex(),oct(),bin()函数前把对象转化为int类型
__eq __,__ lt__,__gt__
__eq__()实现了==运算符
__lt__()实现了<运算符
__gt__()实现了>运算符
举个实现比较运算的例子:
1 | def __gt__(self, other): |

