为什么类的对象不调用__get__和__set__,即描述符方法?

时间:2014-11-05 11:55:00

标签: python descriptor magic-methods

课程如下

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 个答案:

答案 0 :(得分:0)

obj.n 不是描述符对象。它没有任何方法可以使它成为描述符。 type(obj).__dict__['n'].__get__不存在。它只是一个字符串对象。

obj 本身具有此类方法的事实并不重要,因为obj不是属性,obj.n是。

t.d 是一个描述符对象,type(t).__dict__['d'].__get__ 确实存在。因此,当您访问t.d时,您会收到调用__get__方法的结果。

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