gpt4 book ai didi

Python中反射和描述器总结

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python中反射和描述器总结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

反射 。

在Python中,能够通过一个对象,找出type、class、attribute或者method的能力,成为反射.

函数与方法 。

内建函数:

getattr(object,name[,degault])  通过name返回object的属性值,当属性不存在,将使用default返回,如果没有default,则抛出AttributeError。Name必须为字符串.

setattr(object,name,value)  object的属性存在,则覆盖,不存在,新增.

hasattr(object,name)  判断对象是否有这个名字的属性,name必须为字符串 。

反射相关的魔术方法 。

__getattr__() 。

一个类的属性会按照继承关系找,如果找不到,就会执行__getattr__()方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性.

查找顺序为:

Instance.__dict__-->instance.__class__.__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__() 。

__setattr__() 。

可以拦截对实例属性的增加、修改操作,如果要设置生效,需要自己操作实例的__dict__ 。

__delattr__() 。

可以阻止通过实例删除属性的操作,但是通过类依然可以删除属性.

__getattribute__() 。

实例的所有的属性访问,第一个都会调用__getattribute__方法,它阻止了属性的查找,该方法应该返回值或者抛出一个AttributeError异常 。

它的return值将作为属性查找的结果 。

如果抛出AttributeError异常,则会直接调用__gutattr__方法,因为表述属性没有找到.

__grtattribute__方法中为了避免在该方法中无限的递归,他的实现应该永远调用基类的同名方法以访问需要的任何属性,例如:object.__getattribute__(self,name)。一般不使用该方法 。

魔术方法 。

__getattr__() 。

当通过搜索实例、实例的类及祖先类查不到属性,就会调用此方法 。

__setattr__() 。

通过.访问实例的属性,进行增加,修改都要调用它 。

__delattr__() 。

当通过实例来删除属性时调用此方法 。

__getattribute__() 。

实例所有的属性调用都从这个方法开始 。

属性查找顺序:

实例调用__getattribute__() --> Instance.__dict__-->instance.__class__.__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__() .

描述器:

描述器定义 。

在python中,一个类实现了__get__、__set__、__delete__三个方法中的任何一个方法,就是描述器.

如果仅实现了__get__,就是非数据描述符non-data descriptor 。

同时实现了__get__,__set__就是数据描述符 data descriptor 。

如果一个类的类属性设置为描述器实例,那么它被称为owner属主 。

属性查找顺序 。

实例的__dict__优先于非数据描述器,数据描述器优先于实例的__dict__ 。

有__delete__方法有同样的效果,有了这个方法,也是数据描述器.

描述器在python中应用非常广泛,python的方法(包括staticmethod()和class method())都实现为非数据描述器,因此,实现可以重新定义和覆盖方法。这允许单个实例获取与同一个类的其他实例不同的行为.

Python中property()函数实现为一个数据描述器.

原文链接:http://blog.51cto.com/1502606/2179050 。

最后此篇关于Python中反射和描述器总结的文章就讲到这里了,如果你想了解更多关于Python中反射和描述器总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com