在
Test1您
Descriptor未真正用作描述符的情况下,它只是一个称为的普通属性
name,碰巧有一些特殊方法。但这还不是真正的描述符。
如果您阅读有关如何调用描述符的文档,则会看到用于调用描述符方法的机制。在您的情况下,这将意味着
t.name大致相当于:
type(t).__dict__['name'].__get__(t, type(t))
和
t1.name:
type(t1).__dict__['name'].__get__(t1, type(t1))
name是
__dict__在类的而不是实例中查找的,因此区别在于
Test1.__dict__没有称为的描述符
name:
>>> Test.__dict__['name']<__main__.Descriptor object at 0x7f637a57bc90>>>> Test1.__dict__['name']Traceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 'name'
您还应该考虑的是,描述符
value本身设置了属性,这意味着的所有实例
Test将共享相同的值:
>>> t1 = Test(1)init testsetting>>> t2 = Test(2)init testsetting>>> t1.namegetting2>>> t2.namegetting2>>> t1.name = 0setting>>> t2.namegetting0
我认为您迫切希望做的是设置
value,
instance而不是那样
self,这样可以使您获得预期的行为
Test。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)