2012-05-25 4 views
6

을 설정하는 코드입니다하지 않습니다 파이썬 속성은 다음

def Property(func): 
    return property(**func()) 

class A: 
    def __init__(self, name): 
      self._name = name 

    @Property 
    def name(): 
      doc = 'A''s name' 

      def fget(self): 
       return self._name 

      def fset(self, val): 
       self._name = val 

      fdel = None 

      print locals() 
      return locals() 

a = A('John') 
print a.name 
print a._name 
a.name = 'Bob' 
print a.name 
print a._name 

위의 다음과 같은 출력을 생성합니다

{'doc': 'As name', 'fset': <function fset at 0x10b68e578>, 'fdel': None, 'fget': <function fget at 0x10b68ec08>} 
John 
John 
Bob 
John 

코드가 from here를 촬영됩니다.

질문 : 무엇이 잘못 되었나요? 그것은 간단해야하지만 나는 그것을 찾을 수 없습니다.

참고 : 단순히 속성을 숨기는 것이 아니라 복잡한 가져 오기/설정에 대한 속성이 필요합니다.

미리 감사드립니다.

+0

당신이 fset'이'name' 대신'_name'의 설정하지 않는 '것을 100 % 특정 있습니까? 쉽게 실수를하고, 증상을 설명 할 것입니다. –

+0

@MartijnPieters 99.9 %이 코드로 생성 된 코드와 출력을 복사했습니다.) – tonytony

+1

@property def를 사용하는 대신이 속성을 정의하는 이상한 방법 이름 (...) : "docstr"\ n getter','@name.setter def name (...) : setter'? – delnan

답변

8

documentation for property() 상태 :

반환 새로운 스타일의 클래스에 대한 속성 속성 (객체에서 파생 클래스).

클래스가 새 스타일 클래스가 아닙니다 (사용자가 개체를 상속하지 않았 음). 에 클래스 선언을 변경합니다

class A(object): 
    ... 

의도대로 작동합니다.

+0

100 % 정확함! 그걸 생각하지 않았을거야! – jadkik94

+1

파이썬 3.x에서는 모든 클래스가 기본적으로 새로운 스타일이므로, 문제가되지는 않습니다. (어쨌든'object'에서 서브 클래스를 만들지는 않더라도). –

+0

와우 효과가 있습니다. 나는 속성 _did_가 적절하게 값을 얻는다는 사실에 훨씬 더 혼란 스러웠다. 그래서 그것이 실패한 것이 '속성'함수 자체라는 것을 전혀 알지 못했다. – tonytony

1

이 형식을 사용 (위 게시) : http://docs.python.org/library/functions.html#property

class C(object): 
    def __init__(self): 
     self._name = "nameless" 

    @property 
    def name(self): 
     """I'm the 'name' property.""" 
     return self._name 

    @name.setter 
    def name(self, value): 
     self._name = value 

    @name.deleter 
    def name(self): 
     del self._name