2009-12-16 81 views
3

我正在使用的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 

回答

7

只有一個描述符對象,存儲類對象,所以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