類是如下爲什麼類的對象不會調用__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__()
在這裏?
我不確定你在問什麼。你爲什麼期望描述符本身的屬性**被視爲描述符?描述符的要點在於它們與它們屬於的屬性綁定在一起。 'n'在這裏不是描述符。 – 2014-11-05 11:57:10
根據Python doc的說法,我很困惑,「」「描述符是一個帶有」綁定行爲「的對象屬性,其屬性訪問已被描述符協議中的方法覆蓋的屬性」「」,那麼將不會獲取和設置方法至n – anish 2014-11-05 12:07:23
因爲'n'不是描述符。它只是一個屬性*(而不是存在的)。只有'Test.d'是一個描述符對象。你在'Test()'*上訪問'd' *,所以'd'被綁定到'Test()'。所以'd'是一個實現描述符協議的屬性('t.d .__ get__'存在)。 – 2014-11-05 12:08:45