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魔术方法的主要内容,如果未能解决你的问题,请参考以下文章

python魔术方法

python魔术方法

python的魔术方法大全

Python 魔术方法笔记

Python最会变魔术的魔术方法,我觉得是它

[学习记录]python魔术方法与抽象方法like型反思