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): |