2015-04-28 165 views
2

我想更好地理解描述符。瞭解Python描述符

我不明白爲什麼在foo方法中描述符__get__方法沒有被調用。

據我瞭解描述符__get__方法,當我訪問的對象總是被調用通過點操作屬性或當我使用__getattribute__()

按照Python documentation

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 
+0

我不完全明白你的問題是什麼? – user3467349

+0

@ user3467349:'m.z'和'm.x'都是類'RevealAccess'的實例,它實現了描述符協議。 OP期望該協議同時用於'm.z'和'm.x'。 –

+0

@ user3467349:例如在回答問題之前,您需要了解描述符協議*的含義。 –

回答

5

z是在實例一個屬性,而不是通過類。描述符協議僅適用於從類中檢索的屬性。

Descriptor HOWTO

對於對象,所述機械是在object.__getattribute__()其將b.xtype(b).__dict__['x'].__get__(b, type(b))

和在Python數據模型的Implementing Descriptors section:當包含方法(所謂的描述符類)的類的一個實例出現在一個

下列方法只適用所有者類(描述符必須位於其父類之一的所有者類字典或類字典中)。

你的m.z不能在dict類中找到; type(m).__dict__['z']不存在;它代之以在m.__dict__['z']中找到。這裏m所有者類別MyClassz未出現在所有者類字典中。