Skip to content
New issue

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

python描述器引导(翻译)疑问 #17

Open
ficapy opened this issue Jun 15, 2015 · 0 comments
Open

python描述器引导(翻译)疑问 #17

ficapy opened this issue Jun 15, 2015 · 0 comments

Comments

@ficapy
Copy link

ficapy commented Jun 15, 2015

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没有关系

以上如有错误请指出,谢谢~~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant