Skip to content

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

@ficapy

Description

@ficapy

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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions