Python descriptor 描述器
2017-08-29 16:12
288 查看
Descriptor HowTo Guide
概述介绍
python descriptor 包含了自定义的descriptor, 和built-in python descriptors 包含了函数,属性(properties),静态方法,类方法.通常,一个descriptor是一个实例对象的绑定方法”binding behavior”, 他们的这些特性(attribute)可以通过descriptor协议来重写.这些方法为
__get__(),
__set__(),
__delete__().如果上述任何一个方法都被实例对象显式的定义,就可以称之为descriptor
对于默认的上述方法,则是对于实例对象(object)的字典进行get,set,delete操作.
例如: 执行
a.x时,会进行一系列的操作:
首先
a.__dict__['x']
然后继续通过type(a),除了元类
当发现type(a)的基类定义了其中一种descriptor方法之后
Python将会重写默认的方法,调用(invoke) descriptor方法
注意: 只有新式的对象或者类才能调用descriptor方法
(继承自object或者type的类是新式的类)
Descriptor Protocol(描述器协议)
descr.__get__(self, obj, type=None) -->value descr.__set__(self, obj, value) -->Node descr.__delete__(self,obj)
定义了任意一个方法的对象,都可以被称为一个descriptor并且重写默认的行为.
当一个对象同时定义了
__get__(),
__set__(),可以认为它是一个数据描述器(data descriptor),如果仅仅定义了
__get__(),则它为非数据描述前(non-data descriptor)
数据描述器和非数据描述器不同在于如何重写进入实例字典的方法.
如果实例字典的入口函数名和数据描述器一样,则数据描述器优先;如果实例字典的入口函数名和非数据描述器一样,则字典入口函数优先
为了定义只读数据描述器则可以,定义
__get__(),
__set()__, 同时当
__set()__函数调用时,抛出一个
AttributeError的错误
Invoking Descriptors(调用描述器)
描述器可以直接的调用名字,`d.get(obj).更普遍的一种方法是,通过特性方法进行自动的调用object.__getattribute__()可以使
b.x变为
type(b).__dict__['x'].__get__(b,type(b)).
这种实现方法的优先级顺序为:
data descriptors
instance variables
non-data descriptors
最低的优先级
__getattr__()(如果提供了)
重要的点:
descriptors 可以被
__getattribute__()方法调用
重写
__getattribute__()阻止了desciptors的自动调用
__getattribute__()只有新式类可用
object.__getattribute__()和
type.__getattribute__()对于调用
__get__不同
Reference
python2.7 doc相关文章推荐
- Python descriptor
- Python 描述符(Descriptor)入门
- Python的Descriptor在Django中的使用
- python学习笔记-类的descriptor
- 描述器(descriptor)
- python中的 descriptor
- Python 的描述符 descriptor详解
- Python的descriptor
- python descriptor 详解
- Python descriptor
- python descriptor
- Python 描述器 descriptor
- python中descriptor的应用
- Python 描述符(Descriptor)入门
- python descriptor
- Python中用Descriptor实现类级属性(Property)详解
- Python中用Descriptor实现类级属性(Property)详解
- python Descriptor (描述符)
- Python中的Descriptor
- 解密Python中的描述符(descriptor)