2011-05-10 175 views
4

說我定義這個描述:Python:爲什麼不能描述符是實例變量?

class MyDescriptor(object): 

    def __get__(self, instance, owner): 
     return self._value 

    def __set__(self, instance, value): 
     self._value = value 

    def __delete__(self, instance): 
     del(self._value) 

我用它在此:

class MyClass1(object): 
    value = MyDescriptor() 


>>> m1 = MyClass1() 
>>> m1.value = 1 
>>> m2 = MyClass1() 
>>> m2.value = 2 
>>> m1.value 
2 

所以value是一個類屬性,是由所有實例共享。

現在,如果我定義該:

class MyClass2(object) 
    value = 1 

>>> y1 = MyClass2() 
>>> y1.value=1 
>>> y2 = MyClass2() 
>>> y2.value=2 
>>> y1.value 
1 

在這種情況下是value實例屬性,而不是由實例共享。

爲什麼當value是描述符時它只能是類屬性,但是當value是一個簡單的整數時,它變成了一個實例屬性?

回答

8

您在執行MyDescriptor時忽略了instance參數。這就是爲什麼它出現是一個類屬性。也許你想是這樣的:

class MyDescriptor(object): 

    def __get__(self, instance, owner): 
     return instance._value 

    def __set__(self, instance, value): 
     instance._value = value 

    def __delete__(self, instance): 
     del(instance._value) 
+0

你將如何實現MyDescriptor(),使其表現得像一個實例變量? – Continuation 2011-05-10 03:26:01

+1

你試過我的建議嗎? – 2011-05-10 03:28:26

+1

它的工作。謝謝!我之前的評論是在我看到您對答案所做的更新之前做出的。 – Continuation 2011-05-10 03:32:45

0

不會工作,如果你嘗試下面的代碼:

class MyClass1(object): 
    value = MyDescriptor() 
    value2 = MyDescriptor() 

c = MyClass1() 
c.value = 'hello' 
c.value2 = 'world' 

# where c.value also equals to "world"