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),函数将被调用

 

posted @ 2020-06-08 22:49  没有想象力  阅读(110)  评论(0编辑  收藏  举报