定义

通常,一个 descriptor 是具有“绑定行为”的对象属性。所绑定行为可通过 descriptor 协议被自定义的 __get__() , __set__() 和 __delete__() 方法重写。如果一个对象的上述三个方法任意一个被重写,则就可被称为 descriptor。
属性的默认操作是从对象字典中获取、设置和删除一个属性。例如,a.x 有一个查找链,先 a.__dict__['x'] ,若没有则 type(a).__dict__['x'] ,若没有增往上查找父类直到元类。如果查找链中,对象被定义了 descriptor 方法,Python 就会覆盖默认行为。
Descriptor 是一个强大的工具,虽然开发者不常接触到它,但它其实就是类、属性、函数、方法、静态方法、类方法以及 super() 背后的运行机制。
Descriptor 协议
三个方法原型如下所示:
descr.__get__(self, obj, type=None) --> value descr.__set__(self, obj, value) --> None descr.__delete__(self, obj) --> None
数据 descriptor 是同时具有 __get__() 和 __set__() 方法的对象,若只有 __get__() 方法,则为非数据 descriptor。如果实例字典中有和数据 descriptor 同名的入口,则数据 descriptor 优先级更高。相反,非数据 descriptor 优先级低。
让 __set__() 方法抛出异常,就能创建一个只读数据 descriptor。
调用 descriptor
descriptor 可以直接通过方法名调用。例如, d.__get__(obj) 。
而通过访问对象属性,自动调用 descriptor 才是更通用的做法。例如,如果 d 定义了方法 __get__() ,则 obj.d 会调用 d.__get__(obj) 。
对于对象, b.x 会被转换成 type(b).__dict__['x'].__get__(b, type(b)) 。而对于类(是的,类也可以调用), B.x 会被转换成 B.__dict__['x'].__get__(None, B) 。
Descriptor 例子
class RevealAccess(object):
"""A data descriptor that sets and returns values
normally and prints a message logging their access.
"""
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print('Retrieving', self.name)
return self.val
def __set__(self, obj, val):
print('Updating', self.name)
self.val = val
>>> class MyClass(object):
... x = RevealAccess(10, 'var "x"')
... y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5
总结
以上所述是小编给大家介绍的Python 中的 descriptor,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# python
# descriptor
# 详解Python中的Descriptor描述符类
# Python中的descriptor描述器简明使用指南
# 解密Python中的描述符(descriptor)
# Python描述器descriptor详解
# Python中用Descriptor实现类级属性(Property)详解
# python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
# 重写
# 转换成
# 绑定
# 小编
# 是一个
# 就会
# 就能
# 才是
# 在此
# 中有
# 是从
# 给大家
# 更高
# 可以直接
# 就可
# 自定义
# 被称为
# 所示
# 可通过
# 但它
相关文章:
如何快速生成凡客建站的专业级图册?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
如何用景安虚拟主机手机版绑定域名建站?
黑客如何通过漏洞一步步攻陷网站服务器?
如何批量查询域名的建站时间记录?
如何生成腾讯云建站专用兑换码?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何快速搭建高效可靠的建站解决方案?
湖北网站制作公司有哪些,湖北清能集团官网?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站之星后台密码如何安全设置与找回?
盘锦网站制作公司,盘锦大洼有多少5G网站?
教学论文网站制作软件有哪些,写论文用什么软件
?
公司网站的制作公司,企业网站制作基本流程有哪些?
代购小票制作网站有哪些,购物小票的简要说明?
定制建站如何定义?其核心优势是什么?
如何快速搭建高效WAP手机网站?
如何在局域网内绑定自建网站域名?
C++如何使用std::optional?(处理可选值)
建站之星后台密码遗忘或太弱?如何重置与强化?
建站之星Pro快速搭建教程:模板选择与功能配置指南
完全自定义免费建站平台:主题模板在线生成一站式服务
定制建站价位费用解析与套餐推荐全攻略
建站之星与建站宝盒如何选择最佳方案?
内网网站制作软件,内网的网站如何发布到外网?
兔展官网 在线制作,怎样制作微信请帖?
如何快速启动建站代理加盟业务?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何在香港服务器上快速搭建免备案网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何在Windows环境下新建FTP站点并设置权限?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
一键网站制作软件,义乌购一件代发流程?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站主机如何选?高性价比方案全解析
零基础网站服务器架设实战:轻量应用与域名解析配置指南
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
如何快速搭建自助建站会员专属系统?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何通过主机屋免费建站教程十分钟搭建网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何正确选择百度移动适配建站域名?
如何在建站宝盒中设置产品搜索功能?
如何登录建站主机?访问步骤全解析
如何快速搭建个人网站并优化SEO?
seo网站制作优化,网站SEO优化步骤有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。