栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

编写非数据描述符

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

编写非数据描述符

您已经成功创建了正确的非数据描述符,但是随后通过设置实例属性来 屏蔽

d
属性。

因为它是一个
数据描述符,所以实例属性在这种情况下会获胜。添加

__set__
方法时,将描述符变成数据描述符,并且即使存在实例属性,也始终应用数据描述符。(*)

描述符方法

属性访问的默认行为是从对象的字典中获取,设置或删除属性。例如,

a.x
有一个查找链,从
a.__dict__['x']
,然后到
type(a).__dict__['x']
,并一直到
type(a)
排除元类的基类。如果查找到的值是定义描述符方法之一的对象,则Python可能会覆盖默认行为并改为调用描述符方法。优先级链在何处发生取决于定义了哪些描述符方法。

如果对象同时定义

__get__()
__set__()
,则将其视为数据描述符。仅定义
__get__()
的描述符称为非数据描述符(它们通常用于方法,但也可以用于其他用途)。

数据和非数据描述符的不同之处在于,如何计算实例字典中条目的替代值。如果实例的字典具有与数据描述符同名的条目,则数据描述符优先。如果实例的字典具有与非数据描述符同名的条目,则该字典条目优先。

如果您 删除

d
实例属性(从来没有对它进行设置或从实例中删除),描述对象被调用:

>>> class D(object):...     def __init__(self, x = 1395):...         self.x = x...     def __get__(self, instance, owner):...         print "getting", self.x...         return self.x...>>> class C(object):...     d = D()...>>> c = C()>>> c.dgetting 13951395

再次添加一个实例属性,由于实例属性获胜,描述符将被忽略:

>>> c.d = 42  # setting an instance attribute>>> c.d42>>> del c.d   # deleting it again>>> c.dgetting 13951395

另请参见Python数据 模型 参考中的 调用描述符
文档

__


(*)如果数据描述符实现了

__get__
挂钩。 除非 存在于中, 否则
通过访问此类描述符
instance.attribute_name
将返回描述符对象。
'attribute_name'``instance.__dict__



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号