2011-05-10 8 views
4

내가이 기술자 정의 말 :파이썬 : 왜 디스크립터를 인스턴스 변수로 사용할 수 없습니까?

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는 클래스 속성이며 모든 인스턴스가 공유됩니다.

지금 나는이 정의하는 경우 :이 경우 value에서

class MyClass2(object) 
    value = 1 

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

은 인스턴스 속성이며, 인스턴스가 공유되지 않습니다.

value이 설명자인 이유는 클래스 속성 일 수 있지만 value이 인스턴스 속성이되는 이유는 무엇입니까?

답변

8

구현시 instance 매개 변수를 무시합니다 (MyDescriptor). 이 때문에 이 클래스 속성으로 표시됩니다. 아래의 코드를하려고하면

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

+1

내가 제안한 것을 시도 했습니까? –

+1

효과가있었습니다. 감사! 내 이전 의견은 귀하가 귀하의 답변에 대한 업데이트를보기 전에 작성되었습니다. – Continuation

0

가 작동하지 않습니다 :

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

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

# where c.value also equals to "world" 
관련 문제