2014-11-05 83 views
0

類是如下爲什麼類的對象不會調用__get__和__set__即描述符方法?

class Descriptor(object): 
    def __init__(self,name=None): 
     self.n = name 
    def __get__(self,instance,cls): 
     print ("Get",self.n) 
    def __set__(self,instance,value): 
     print ("set",self.n,value) 

現在,如果我創建Descriptor類和訪問屬性n的對象,那麼應該不是訪問__get__方法?

obj = Descriptor() 
print (obj.n) 

如果我創建另一類繼承Descriptor類和我創建Descriptor裏面派生類的對象,然後__get____set__越來越調用。

class Test(Descriptor): 
    d = Descriptor("ansh") 

t = Test() 
print (t.d) 

我對這種行爲感到困惑。

the docs,描述由__getattribute__()方法object.__getattribute__()調用和type.__getattribute__()做出不同的呼叫__get__(),什麼是object.__getattribute__()在這裏?

+1

我不確定你在問什麼。你爲什麼期望描述符本身的屬性**被視爲描述符?描述符的要點在於它們與它們屬於的屬性綁定在一起。 'n'在這裏不是描述符。 – 2014-11-05 11:57:10

+0

根據Python doc的說法,我很困惑,「」「描述符是一個帶有」綁定行爲「的對象屬性,其屬性訪問已被描述符協議中的方法覆蓋的屬性」「」,那麼將不會獲取和設置方法至n – anish 2014-11-05 12:07:23

+1

因爲'n'不是描述符。它只是一個屬性*(而不是存在的)。只有'Test.d'是一個描述符對象。你在'Test()'*上訪問'd' *,所以'd'被綁定到'Test()'。所以'd'是一個實現描述符協議的屬性('t.d .__ get__'存在)。 – 2014-11-05 12:08:45

回答

0

obj.n而不是描述符對象。它沒有任何使它成爲描述符的方法。 type(obj).__dict__['n'].__get__不存在。它只是一個字符串對象。

obj本身有這樣的方法並不重要,在這裏,因爲obj不是屬性的事實,obj.n是。

t.d一個描述符對象,type(t).__dict__['d'].__get__確實存在。所以當你訪問t.d時,你會得到調用__get__方法的結果。

實現描述符協議始終是屬性本身。它必須直接有描述符方法爲那些被調用。

相關問題