码迷,mamicode.com
首页 > 编程语言 > 详细

python魔术方法

时间:2019-01-12 00:29:09      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:查看属性   地址   直接   ==   类的属性   必须   hash冲突   dict   表达式   

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魔术方法

标签:查看属性   地址   直接   ==   类的属性   必须   hash冲突   dict   表达式   

原文地址:https://www.cnblogs.com/s-p-l/p/10255875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!