We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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__还是使用描述符规则。
obj.__dict__
type(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,使用描述符规则
__set__
no-data description
a.__dict__
data description
另外根据你的注解好像意思是实例字典是一个资料描述符而实例函数是一个非资料描述符。这里的实例字典是指代的obj.__dict__吗?实例函数的实现我没明白指代的是什么。使用isinstance(obj.__dict__,dict)得到True可以看出obj.__dict__实质就是一个dict,是没有__get__和__set__属性的,因此和data-description&no-data description没有关系
isinstance(obj.__dict__,dict)
True
dict
__get__
data-description&no-data description
以上如有错误请指出,谢谢~~
The text was updated successfully, but these errors were encountered:
No branches or pull requests
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__
还是使用描述符规则。以下例子可能比较合适
注释掉
__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
没有关系以上如有错误请指出,谢谢~~
The text was updated successfully, but these errors were encountered: