5

我试图更好地理解描述符。

我不明白为什么在 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
4

1 回答 1

8

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没有出现在所有者类字典中。

于 2015-04-28T20:44:34.790 回答