python魔术方法
Posted s-p-l
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python魔术方法相关的知识,希望对你有一定的参考价值。
python魔术方法:
在Python中以两个下划线开头的方法,__init__、__str__、__doc__、__new__等,被称为"魔术方法"(Magic methods)。魔术方法在类或对象的某些事件出发后会自动执行,如果希望根据自己的程序定制自己特殊功能的类,那么就需要对这些方法进行重写。
特殊属性:
查看属性:
__dir__:返回类或者对象的所有成员名称列表。dir()函数就是调用__dir__().如果提供__dir__(),则会尽量从__dir__()属性中收集信息。
如果dir([obj])参数obj包含方法__dir__(),则该方法将会被调用,如果参数obj不包含__dir__(),则该方法将会最大限度的收集参数信息。
dir()对于不同类型的对象具有不同的行为:
如果对象是模块对象,返回的列表包含模块的属性名;
如果对象是类型或者类对象,返回的列表包含类的属性名,及它的基类的属性名;
否则,返回列表包含对象的属性名,它的类的属性名和类的基类的属性名
__hash__方法:内建函数hash()调用的返回值,返回一个整数。如果定义这个方法,该类的实例就可hash
例:
上例中s为一个集合,但是并没有去重,__hash__方法只是返回一个hash值作为set的key,但是去重,还需要__eq__来判断2个对象是否相等。
hash值相等,只是hash冲突,不能说明两个对象是否相等,因此,一般来说提供__hash__方法是为了作为set或者dict的key,所以去重要同时提供__eq__方法。
不可hash的对象isinstance(p,collection.Hashable)一定为False
list类实例不可hash,是因为源码中有一句__hash__=None,所有的类都继承object,这个类具有__hash__方法,如果一个类不能被hash,就把__hash__设置成None
__eq__方法:对应==操作符,判断2个对象是否相等,返回bool值
上例改造:
通过实现__eq__方法,实现去重
__bool__:内建函数bool(),或者对象放在逻辑表达式的位置,调用这个函数返回布尔值,没有定义__bool__(),就找__len__()返回长度,非0为真,如果__len__()也没有定义,那么返回所有实例都返回真
可视化:
__repr__:内建函数repr()对一个对象获取字符串表达,调用__repr__方法返回字符串表达,如果__repr__方法也没有定义,就直接返回object的定义,就是显示内存地址信息
__str__:str()函数,内建函数format(),print()函数调用,需要返回对象的字符串表达,如果没有定义,就去调用__repr__方法返回字符串表达,如果__repr__没有定义,就直接返回对象的内存地址信息
__bytes__:byte()函数调用,返回一个对象的bytes表达,即返回bytes对象
运算符重载:
operator模块提供以下的特殊方法,可以将类的实例使用下面的操作符进行操作
例:完成Point类设计,实现判断点相等的方法,并完成向量的加法
@functools.total_ordering装饰器:
实现比较大小的方法,全写太麻烦,使用该装饰器可大大简化代码,但要求__eq__必须实现,其他方法__it__,__le__,__gt__,__ge__实现其一
容器相关的方法
__len__:内建函数len(),返回对象的长度,如果把对象当作容器类型看,就如同list或者dict,bool()函数调用的时候,如果没有__bool__()方法,则会看__len__()方法是否存在,存在返回非0为真
__iter__:迭代容器时,调用,返回一个新的迭代器对象
__contains__:in成员运算符,没有实现,就调用__iter__方法遍历
__getitem__:实现self[key]访问,序列对象,key接受整数为索引,或者切片,对于set和dict,key为hashable,key不存在发生keyerror异常
__setitem__:和__getitem__的访问类似,时设置值的方法
__misssing__:字典或者其子类使用__getitem__()调用时,key不存在执行该方法
可调用对象:
__call__:类中定义一个该方法,实例就可以像函数一样调用
例:定义一个类,并实例化得到其实例,将实例像函数一样调用
例:定义一个斐波那契数列,使用迭代的方法,返回容器的长度,支持索引的方法
使用类来实现斐波那契数列,可以缓存数据,便于检索。
以上是关于python魔术方法的主要内容,如果未能解决你的问题,请参考以下文章