类是如下为什么类的对象不会调用__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