2014-11-05 68 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__方法的结果。

实现描述符协议始终是属性本身。它必须直接有描述符方法为那些被调用。

相关问题