当前位置:主页 > python教程 > Python中descriptor的详细介绍

怎样理解Python中descriptor

发布:2020-03-02 10:51:12 80


为网友们分享了Python相关的编程文章,网友许天华根据主题投稿了本篇教程内容,涉及到Python、descriptor、Python中descriptor的详细介绍相关内容,已被730网友关注,相关难点技巧可以阅读下方的电子资料。

Python中descriptor的详细介绍

本文给大家分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进行ffmpeg推流和拉流rtsp、rtmp实例详解

    发布:2023-03-02

    Python推流本质是调用FFmpeg的推流进程,下面这篇文章主要给大家介绍了关于Python进行ffmpeg推流和拉流rtsp、rtmp的相关资料,需要的朋友可以参考下


  • python中flatten()函数用法详解

    发布:2023-04-08

    本文主要介绍了python中flatten()函数用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • python标准库有哪些

    python标准库有哪些

    发布:2022-12-03

    为网友们分享了关于python 标准库的教程,python有如下标准库:操作系统接口、文件通配符、命令行参数、错误输出重定向和终止程序、字符串正则匹配、数学、访问互联网、日期和时间、数据压缩、性能度量、测试模块。


  • Python编程必学书单

    发布:2021-04-30

    对于学习Python语言,如何选择合适的Python书单,是不是已经眼花缭乱,不知道该选择哪本好了呢?今天我来为大家分享几本不可错过的Python好书


  • Python动态赋值的易错点总结

    发布:2019-06-20

    在本文中我们给大家整理了关于Python动态赋值的陷阱的相关知识点内容,需要的朋友们学习下。


  • Python实现TOPSIS分析法的示例代码

    发布:2023-04-15

    TOPSIS法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确反应各评价方案之间的差距。本文将利用Python实现这一方法,感兴趣的可以了解一下


  • Python对微信好友进行数据分析实操详解

    发布:2019-07-31

    这篇文章主要介绍了使用Python对微信好友进行数据分析的实现代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下


  • Python 稀疏矩阵中sparse存储和转换实例讲解

    发布:2021-04-27

    这篇文章主要介绍了Python 稀疏矩阵-sparse 存储和转换的相关资料,需要的朋友可以参考下


网友讨论