理解Python描述符

Gar*_*sta 3 python descriptor python-descriptors

我想更好地理解描述符.

我不明白为什么在foo __get__方法中没有调用描述符方法.

据我理解描述符,__get__当我通过点运算符或我使用时访问对象属性时,总是调用该方法__getattribute__().

根据Python文档:

class RevealAccess(object):
    def __init__(self, initval=None, name='var'):
        self.val = initval
        self.name = name

    def __get__(self, obj, objtype):
        print('Retrieving', self.name)
        return self.val

    def __set__(self, obj, val):
        print('Updating', self.name)
        self.val = val

class MyClass(object):
    x = RevealAccess(10, 'var "x"')
    y = 5

    def foo(self):
        self.z = RevealAccess(13, 'var "z"')
        self.__getattribute__('z')
        print(self.z)

m = MyClass()
m.foo()
m.z # no print
m.x # prints var x
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

z实例上的属性,而不是类.描述符协议仅适用于从类中检索的属性.

描述符HOWTO:

对于物体,机器在object.__getattribute__()其中转变b.xtype(b).__dict__['x'].__get__(b, type(b)).

并在Python数据模型的实现描述符部分:

以下方法仅在包含该方法的类的实例(所谓的描述符类)出现在所有者类中时才适用(该描述符必须位于所有者的类字典中或其父类之一的类字典中).

m.z不能在课堂上找到你; type(m).__dict__['z']不存在; 它被发现了m.__dict__['z'].这m是实例和所有者MyClass,并且z不会出现在所有者类字典中.