python 的魔术方法
魔术方法
在类中定义的魔术方法,只会对该类的实例起作用,不会对类对象起作用。在类的定义的魔术方法大部分都是类的实例才能“触发”。
实例对象
__new__(cls, *args, **kwargs)
staticmethod
作用:根据提供的类,构造一个该类型的实例
调用:构造实例、实例化对象时候调用
返回值:返回一个实例对象。
python 的复杂类型传参使用的是引用地址,在函数中执行会改变原值。关键字传参时先构建字典
__init__(self)
作用:对实例进行初始化,可以不进行初始化
调用:__new__函数调用后自动执行,但是和__new__为两个不同的作用域,不同的参数对象。
返回值:必须为None
__del__(self)
作用:一般在这个对象销毁之前,将这个对象相关的资源进行释放。
调用:对象的引用计数为0后,垃圾回收机制对其进行清理前调用。
返回值:pass
对象可视化
__str__(self)
作用:返回一个很好地向人描述对象的字符串
调用:直接作为print(), format(), str()函数的参数,当没有这个__str__ 方法会使用__repr__
返回值:必须为字符串,将直接作为显示输出。
__repr__(self)
作用:类似于__str__
如果实现了__repr__而没有定义__str__,那么对象将会表现出__str__ = __repr__反之则不会
__bytes__(self):
作用:一个对象的bytes表现形式
调用:bytes()作用时候,调用这个对象的__bytes__方法,返回这个对象的二进制形式
返回值:返回值必须是二进制的对象类型,将对象encode()
__hash__(self)
__eq__(self, other)
作用:作为这个对象的 “ 哈希算法 ”,求哈希时,将会调用该对象的__hash__方法。
调用:hash()作用于这个对象时,调用这个函数
返回值:返回一个哈希值范围内的整数
- 计算哈希值以进程为“作用域”。同一个进程中相同的元素哈希值一定相等,否则一定不同(未产生哈希冲突时)。
- 哈希表去重:
- 值相同, 及__eq__返回值相同,未定义eq调用object,使用地址比较。
- 哈希值相同
当实现了__eq__(self, other)后,必须实现 __hash__(self)方法这个实例才可以哈希。
当不可哈希时,将 __hash__ = None , 明确不可哈希,哈希必须返回 interger
__bool__
__len__
作用:bool 计算结果
调用:使用bool函数时。
返回值:True 或者 False,返回其他值使用等效False判断。
如果没有返回值,看__len__的长度,为0为false,否则为True。
四则运算符重载
__sub__(self, other)
__isub__(self, other)
__isub___注意返回值,会覆盖self
当这个对象未定义 __isub__而进行 -= 计算时候,将计算调用__sub__方法,并将__sub__方法的返回值,赋值给self,这可能造成self被不同类型的数据覆盖。所以重载时注意定义 __i方法__
运算符重载
进行大小运算时,可以使用funtools.total_ordering装饰器定义大小比较规则;也可以自定义,必须实现__eq__ ,其他__lt __, __le__, __gt__, __ge__ 方法实现其一即可。
容器相关
__len__(self)
返回长度,正整数。判断bool时,没有bool方法,使用__len__==0 为 false
__contain__(self, item)
成员运算符,使用in但是未定义该方法时,使用__iter__迭代计算
__iter__(self)
迭代self自身,__iter__一般定义为生成器函数,使用yield返回结果
__getitem__(self, item):
键值对取值操作,支持index 和 key-vlaue取值
__setitem__(self, key, value):
设置键值对操作。
__missing__(self, key):
字典或者其子类使用key取值时,key不存在时调用该方法
__call__(self,*args, **kwargs)
在类中定义了该方法,这个类的实例将可被调用。self(*args, **kwargs) => cls .__call__(self, *args, **kwargs),函数将被调用