跨类共享值的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'] 

该值将直接返回。因此,描述符能够将其数据存储在“隐藏”位置,可以这么说。

+1

我认为部分问题是python.org上有一个例子,基于同样的原因基本上是错误的。它是http://docs.python.org/howto/descriptor.html中的描述符示例,是搜索'描述符python'时的第一个结果。 – damix911 2012-08-05 16:47:20