gpt4 book ai didi

轻松理解Python 中的 descriptor

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章轻松理解Python 中的 descriptor由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

定义 。

通常,一个 descriptor 是具有“绑定行为”的对象属性。所绑定行为可通过 descriptor 协议被自定义的 __get__() , __set__() 和 __delete__() 方法重写。如果一个对象的上述三个方法任意一个被重写,则就可被称为 descriptor.

属性的默认操作是从对象字典中获取、设置和删除一个属性。例如,a.x 有一个查找链,先 a.__dict__['x'] ,若没有则 type(a).__dict__['x'] ,若没有增往上查找父类直到元类。如果查找链中,对象被定义了 descriptor 方法,Python 就会覆盖默认行为.

Descriptor 是一个强大的工具,虽然开发者不常接触到它,但它其实就是类、属性、函数、方法、静态方法、类方法以及 super() 背后的运行机制.

Descriptor 协议 。

三个方法原型如下所示:

?
1
2
3
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 例子 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

原文链接:http://www.tuicool.com/articles/EvqAFj3 。

最后此篇关于轻松理解Python 中的 descriptor的文章就讲到这里了,如果你想了解更多关于轻松理解Python 中的 descriptor的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com