位置: 编程技术 - 正文

深入解析Python中的descriptor描述器的作用及用法(python 解析)

编辑:rootadmin

推荐整理分享深入解析Python中的descriptor描述器的作用及用法(python 解析),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python解析库有哪些,python解析chunked,python求解析解,深入理解python,python 解析,深入理解python,python 解析算法,python 解析算法,内容如对您有帮助,希望把文章链接给更多的朋友!

一般来说,一个描述器是一个有“绑定行为”的对象属性(object attribute),它的访问控制被描述器协议方法重写。这些方法是 __get__(), __set__(), 和 __delete__() 。有这些方法的对象叫做描述器。

默认对属性的访问控制是从对象的字典里面(__dict__)中获取(get), 设置(set)和删除(delete)它。举例来说, a.x 的查找顺序是, a.__dict__['x'] , 然后 type(a).__dict__['x'] , 然后找 type(a) 的父类(不包括元类(metaclass)).如果查找到的值是一个描述器, Python就会调用描述器的方法来重写默认的控制行为。这个重写发生在这个查找环节的哪里取决于定义了哪个描述器方法。注意, 只有在新式类中时描述器才会起作用。(新式类是继承自 type 或者 object 的类)

描述器是强大的,应用广泛的。描述器正是属性, 实例方法, 静态方法, 类方法和 super 的背后的实现机制。描述器在Python自身中广泛使用,以实现Python 2.2中引入的新式类。描述器简化了底层的C代码,并为Python的日常编程提供了一套灵活的新工具。

描述器协议

一个对象如果是一个描述器,被当做对象属性(很重要)时重写默认的查找行为。

如果一个对象同时定义了__get__和__set__,它叫data descriptor。仅定义了__get__的描述器叫non-data descriptor。

data descriptor和non-data descriptor区别在于: 相对于实例的字典的优先级,如果实例字典有与描述器具同名的属性,如果描述器是data descriptor,优先使用data descriptor。如果是non-data descriptor,优先使用字典中的属性。

这里B是一个non-data descriptor所以当a.name = 'kk'的时候,a.__dict__里会有name属性, 接下来给它设置__set__

因为data descriptor访问属性优先级比实例的字典高,所以a.__dict__是空的。

深入解析Python中的descriptor描述器的作用及用法(python 解析)

描述器的调用描述器可以直接这么调用: d.__get__(obj)

然而更常见的情况是描述器在属性访问时被自动调用。举例来说, obj.d 会在 obj 的字典中找 d ,如果 d 定义了 __get__ 方法,那么 d.__get__(obj) 会依据下面的优先规则被调用。

调用的细节取决于 obj 是一个类还是一个实例。另外,描述器只对于新式对象和新式类才起作用。继承于 object 的类叫做新式类。

对于对象来讲,方法 object.__getattribute__() 把 b.x 变成 type(b).__dict__['x'].__get__(b, type(b)) 。具体实现是依据这样的优先顺序:资料描述器优先于实例变量,实例变量优先于非资料描述器,__getattr__()方法(如果对象中包含的话)具有最低的优先级。完整的C语言实现可以在 Objects/object.c 中 PyObject_GenericGetAttr() 查看。

对于类来讲,方法 type.__getattribute__() 把 B.x 变成 B.__dict__['x'].__get__(None, B) 。用Python来描述就是:

其中重要的几点:

描述器的调用是因为 __getattribute__() 重写 __getattribute__() 方法会阻止正常的描述器调用 __getattribute__() 只对新式类的实例可用 object.__getattribute__() 和 type.__getattribute__() 对 __get__() 的调用不一样 资料描述器总是比实例字典优先。 非资料描述器可能被实例字典重写。(非资料描述器不如实例字典优先) super() 返回的对象同样有一个定制的 __getattribute__() 方法用来调用描述器。调用 super(B, obj).m() 时会先在 obj.__class__.__mro__ 中查找与B紧邻的基类A,然后返回 A.__dict__['m'].__get__(obj, A) 。如果不是描述器,原样返回 m 。如果实例字典中找不到 m ,会回溯继续调用 object.__getattribute__() 查找。(译者注:即在 __mro__ 中的下一个基类中查找)

注意:在Python 2.2中,如果 m 是一个描述器, super(B, obj).m() 只会调用方法 __get__() 。在Python 2.3中,非资料描述器(除非是个旧式类)也会被调用。 super_getattro() 的实现细节在: Objects/typeobject.c ,[del] 一个等价的Python实现在 Guido's Tutorial [/del] (译者注:原文此句已删除,保留供大家参考)。

以上展示了描述器的机理是在 object, type, 和 super 的 __getattribute__() 方法中实现的。由 object 派生出的类自动的继承这个机理,或者它们有个有类似机理的元类。同样,可以重写类的 __getattribute__() 方法来关闭这个类的描述器行为。

描述器例子下面的代码中定义了一个资料描述器,每次 get 和 set 都会打印一条消息。重写 __getattribute__() 是另一个可以使所有属性拥有这个行为的方法。但是,描述器在监视特定属性的时候是很有用的。

这个协议非常简单,并且提供了令人激动的可能。一些用途实在是太普遍以致于它们被打包成独立的函数。像属性(property), 方法(bound和unbound method), 静态方法和类方法都是基于描述器协议的。

Python的Tornado框架的异步任务与AsyncHTTPClient 高性能服务器TornadoPython的web框架名目繁多,各有千秋。正如光荣属于希腊,伟大属于罗马。Python的优雅结合WSGI的设计,让web框架接口实现千秋一统。WSG

结合Python的SimpleHTTPServer源码来解析socket通信 何谓socket计算机,顾名思义即是用来做计算。因而也需要输入和输出,输入需要计算的条件,输出计算结果。这些输入输出可以抽象为I/O(inputoutput)。

总结网络IO模型与select模型的Python实例讲解 网络I/O模型人多了,就会有问题。web刚出现的时候,光顾的人很少。近年来网络应用规模逐渐扩大,应用的架构也需要随之改变。Ck的问题,让工程师

标签: python 解析

本文链接地址:https://www.jiuchutong.com/biancheng/387646.html 转载请保留说明!

上一篇:Python中的字符串查找操作方法总结(python中的字符串的英文)

下一篇:Python的Tornado框架的异步任务与AsyncHTTPClient(python tornado框架)

  • 车船使用税新规2020
  • 会计核算不实
  • 企业合并相关舞弊风险有哪些
  • 预付账款改为什么科目
  • 房屋租赁费增值税专用发票几个点
  • 建筑业确认主营业务收入
  • 预付房租是否需要分摊处理呢?
  • 促销费属于哪个税目
  • 购进货物作为优秀员工的奖励是否可以进项抵扣?
  • 资本公积盈余公积区别
  • 长期待摊费用当月减少当月摊销吗
  • 通用日记账核算方法
  • 收到外单位奖励怎么回复
  • 个体户生产经营所得怎么报税
  • 税务变更后之前的进项
  • 企业所缴税款能抵税吗
  • 分期收款计提销项税怎么算
  • 免税单位无租使用房产怎么缴纳房产税
  • 增值税专用发票丢了怎么补救
  • 王者荣耀电脑版怎么键盘操作
  • 苹果14
  • 部分苹果iOS17功能延后推出
  • win10的病毒隔离有用吗
  • 联想win10自动修复失败还能保存文件吗
  • 企业发生的哪些费用可以结转
  • 资本公积转增股本需要缴纳个人所得税吗
  • Ichetucknee河的海牛,佛罗里达州 (© Jennifer Adler/Alamy)
  • php锁定文本
  • 免费GPU:九天•毕昇平台使用教程
  • 建筑企业跨省经营
  • 梅尔加足球俱乐部
  • 资产减值损失和存货跌价准备有什么区别
  • 百度地图 申请
  • 大学生网页设计大赛
  • php使用for循环实现乘法口诀表
  • thinkphp消息通知
  • 企业所得税怎么征收几个点
  • 结转生产成品
  • 金税盘每年服务费
  • dedecms织梦不同栏目导航显示不同样式的方法
  • 企业合并属于非企业吗
  • 加油发票怎么报税
  • 预收的贷方余额表示什么
  • 坏账损失的会计分录小企业会计准则
  • 企业变更法人的原因怎么写
  • 公司向个人借款怎么做账
  • 内账需要哪些单据
  • 材料盘盈如何入账
  • 永利股权投资基金怎么样
  • 融资租入固定资产的账务处理
  • 年底盈利但有往年亏损怎么处理
  • 增值税发票开负数怎么做账?
  • 加计抵减附加税怎么算
  • 旅游服务会议费发票
  • win8.1补丁打不上
  • windows中双击硬盘驱动器图标操作的作用
  • 从根上保证电脑安全、不中毒的方法
  • 电脑系统停用
  • shell 写入文本
  • ubuntu下安装deb文件
  • mac vm安装win10
  • linux系统编译命令
  • 原版windowsxp安装
  • linuxcoll
  • nodejs模拟浏览器环境
  • jquery简单网页
  • 好看的css样式代码
  • cocos2dx4.0入门
  • 微信小程序图片加载不出来
  • css写文字
  • python嵌套列表生成
  • junit 原理
  • shell脚本启动应用程序
  • python下载方法
  • 编写python程序的步骤
  • jQuery基于$.ajax设置移动端click超时处理方法
  • 广东省电子税务局登录方式
  • 安徽省马鞍山地区代码
  • 工会经费怎么缴纳不了
  • 电子税务局官网湖南省
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设