课程如下
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__()
在这里?
答案 0 :(得分:0)
obj.n
不是描述符对象。它没有任何方法可以使它成为描述符。 type(obj).__dict__['n'].__get__
不存在。它只是一个字符串对象。
obj
本身具有此类方法的事实并不重要,因为obj
不是属性,obj.n
是。
t.d
是一个描述符对象,type(t).__dict__['d'].__get__
确实存在。因此,当您访问t.d
时,您会收到调用__get__
方法的结果。
始终是属性本身实现描述符协议。它必须直接具有要被调用的描述符方法。