跨类共享值的Python描述符
问题描述:
我正在使用的python描述符在其所有者类的所有实例*享其值。我怎样才能让每个实例的描述符包含自己的内部值?跨类共享值的Python描述符
class Desc(object):
def __init__(self, initval=None,name='val'):
self.val = initval
self.name = name
def __get__(self,obj,objtype):
return self.val
def __set__(self,obj,val):
self.val = val
def __delete__(self,obj):
pass
class MyClass(object):
desc = Desc(10,'varx')
if __name__ == "__main__":
c = MyClass()
c.desc = 'max'
d = MyClass()
d.desc = 'sally'
print(c.desc)
print(d.desc)
输出是这样的,最后一次通话设置两个对象的值:
localhost $ python descriptor_testing.py
sally
sally
答
只有一个描述符对象,存储类对象,所以self
总是相同的。如果你想存储每个对象的数据,并通过描述符访问它,你必须将数据存储在每个对象上(可能是更好的想法),或者存储在每个对象所关键的数据结构中(一个我不喜欢的想法尽可能多)。
我会保存实例对象的数据:
在这种情况下,数据将被存储在obj
的‘VARx前提’在其__dict__
条目。由于数据描述符查找是如何工作的,虽然,可以通过“影子”的存储位置与描述的:
class MyClass(object):
varx = Desc('varx')
在这种情况下,当你查找:
MyClass().varx
的描述对象被称为并且可以执行查找,但是当查找如下所示时:
MyClass().__dict__['varx']
该值将直接返回。因此,描述符能够将其数据存储在“隐藏”位置,可以这么说。
我认为部分问题是python.org上有一个例子,基于同样的原因基本上是错误的。它是http://docs.python.org/howto/descriptor.html中的描述符示例,是搜索'描述符python'时的第一个结果。 – damix911 2012-08-05 16:47:20