-
Notifications
You must be signed in to change notification settings - Fork 433
Open
Description
http://pyzh.readthedocs.org/en/latest/Descriptor-HOW-TO-Guide.html#id11
在讲述资料描述符和非资料描述符的区别的时候
资料描述器和非资料描述器的区别在于:相对于实例的字典的优先级。如果实例字典中有与描述器同名的属性,如果描述器是资料描述器,优先使用资料描述器,如果是非资料描述器,优先使用字典中的属性。
译者注:这就是为何实例 a 的方法和属性重名时,比如都叫 foo Python会在访问 a.foo 的时候优先访问实例字典中的属性,因为实例函数的实现是个非资料描述器
这里的原因应该是访问的时候属性查找顺序造成的。先查找obj.__dict__再查找type(obj).__dict__。属性在前一个字典里面,函数在后一个字典里面。data和no-data的主要区别根据描述可以知道仅仅用于区分属性被调用的时候是使用obj.__dict__还是使用描述符规则。
以下例子可能比较合适
class reify(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __get__(self, inst, objtype=None):
val = self.wrapped(inst)
setattr(inst, self.wrapped.__name__, 10)
return val
# def __set__(self, instance, value):
# return
class A(object):
@reify
def a(self):
return 4
a = A()
print(a.a)
注释掉__set__是no-data description,调用a属性使用a.__dict__不注释则为data description,使用描述符规则
另外根据你的注解好像意思是实例字典是一个资料描述符而实例函数是一个非资料描述符。这里的实例字典是指代的obj.__dict__吗?实例函数的实现我没明白指代的是什么。使用isinstance(obj.__dict__,dict)得到True可以看出obj.__dict__实质就是一个dict,是没有__get__和__set__属性的,因此和data-description&no-data description没有关系
以上如有错误请指出,谢谢~~
4b5ent1 and MonchiLin
Metadata
Metadata
Assignees
Labels
No labels