怎样理解Python中descriptor

  • 时间:
  • 6554人关注

本文给大家分Python 中的 descriptor相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧,另外这篇文章主要知识点是关于Python、descriptor、Python的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

本文给大家分Python 中的 descriptor相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧

 

定义

通常,一个 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中线程的MQ消息队列实现及优缺点详解

下一篇:Python中根据字符串调用函数的实现方法

相关内容

  • Python如何限制输出日志的大小

    这篇文章主要介绍了Python 限制输出日志的大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    05-06Python限制日志大小

    阅读更多
  • python实现可视化的MD5、sha256哈希加密小工具

    这篇文章主要介绍了详解python实现可视化的MD5、sha256哈希加密小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    04-07python MD5、sha256哈希加密

    阅读更多
  • Python gevent协程切换实现方法

    这篇文章主要介绍了Python gevent协程切换实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    04-07Python gevent协程切换

    阅读更多
  • python/golang实现循环链表的代码

    这篇文章主要介绍了python/golang如何实现循环链表,帮助大家更好的理解和学习循环链表的实现方法,感兴趣的朋友可以了解下

    04-07python/golang 循环链表

    阅读更多
  • 2020版Python学习路线图(附学习资料)

    这篇文章主要介绍了Python学习路线图(2020最新版),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    04-07Python学习路线图

    阅读更多
  • Python计算机视觉编程

    Python计算机视觉编程

    大小:4.8 MBPython编程

    点击下载
  • Python与量化投资:从基础到实战

    Python与量化投资:从基础到实战

    提供Python零基础入门及量化策略建模参考及实现,讲解如何利用Python进行量化投资,包括对数据的获取、整理、分析挖掘、信号构建、策略构建、回测、策略分析等,可作为专业金融从业者进行量化投资的工具书

    大小:248.2 MBPython零基础

    点击下载
  • Python Cookbook

    Python Cookbook

    《Python Cookbook(第3版)中文版》介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字、日期和时间,迭代器和生成器,文件和I/O,数据编

    大小:29.4 MBPython

    点击下载
  • Python数据科学:技术详解与商业实践

    Python数据科学:技术详解与商业实践

    本书共19章,第1章介绍数据科学中涉及的基本领域;第2~3章介绍与数据工作紧密相关的Python语言基础;第4章讲解描述性统计分析在宏观业务领域的分析;

    大小:154 MBPython

    点击下载
  • Python3标准库

    Python3标准库

    这书由杰出Python权威专家亲身绘制,Python語言的关键开发者鼎力推荐。 对程序猿来讲,标准库与語言自身 一样关键,它就象1个百宝箱,能为各种各样普遍的每日任务出示极致的解决方法,因

    大小:148.9 MBPython

    点击下载
  • 利用Python进行数据分析(第2版)

    利用Python进行数据分析(第2版)

    本书涵盖大量具体的实践建议,以及大量综合应用方法,教大家如何利用各种Python库高效地解决各式各样的数据分析问题,这里提供利用Python进行数据分析英文原版下载,附件集合了第二版英文原文、第二版的笔记精要、以及第二版原书的代码

    大小:91.7 MBPython

    点击下载
  • 你也能看得懂的Python算法书

    你也能看得懂的Python算法书

    很杰出:凝聚力4位创作者10年程序编写工作经验,陪你理解优化算法的精粹 很趣味:全书选用栩栩如生幽默的語言,让优化算法已不好学 很实战演练:全书包含36个案例,9类别优化算法,很有

    大小:54 KBPython算法

    点击下载
  • Python数据分析与应用

    Python数据分析与应用

    大小:281 MBPython数据

    点击下载
  • Python程序设计与算法基础教程

    Python程序设计与算法基础教程

    大小:107.6 MBPython编程

    点击下载

学习笔记