2010-03-09 4 views
32

파이썬에서 클래스 속성을 정의하는 가장 좋은 방법은 무엇이며 그 이유는 무엇입니까? 한 클래스에서 두 가지를 모두 사용해도 괜찮습니까?Python에서 속성을 정의하는 기본 방법 : 속성 장식 자 또는 람다?

@property 
def total(self): 
    return self.field_1 + self.field_2 

또는

total = property(lambda self: self.field_1 + self.field_2) 
+1

"람다를 경유 한 재산"을 보았을 때 그것이 "선호"될 수 있다고 생각하게 만들었습니까? 이거 많이 봤어? 그렇다면 어디에서? –

+0

@ S.Lott 일부 파이썬 책은 기억이 안납니다. 나는 지금부터 데코레이터를 사용할 것이다. 문제 없어. :-) – parxier

답변

21

데코레이터 양식은이 읽기 전용 속성으로 방법을 설정하려는 당신이 보여준 경우에 아마도 가장 좋습니다. 두 번째 경우는 getter뿐만 아니라 setter/deleter/docstring을 제공하거나 값을 파생시키는 메서드와 다른 이름을 가진 속성을 추가하려는 경우에 더 좋습니다.

+10

+1 : 람다를 사용하지 마십시오. 부디. –

+28

S.Lott - 왜 안 되니? (호기심 논쟁이 아닙니다.) – Yarin

+0

@ S.Lott : 그래도 docstring을 허용하지 않는 lambdas의 제한에 대한 해결 방법은 무엇입니까? – smci

4

람다를 사용하지 마십시오. 첫 번째 속성은 읽기 전용 속성에 적합하고 두 번째 속성은보다 복잡한 경우에 실제 메서드와 함께 사용됩니다. 다른 나는 보통 같은 것을 할 나는 장식을 사용하여 읽기 전용 속성에 대한

49

:

class Bla(object): 
    @property 
    def elegant(self): 
     return self._elegant 

    @elegant.setter 
    def elegant(self, value): 
     self._elegant = value 
: 파이썬의

최신 버전이 장식 접근을 강화 : 갱신

class Bla(object): 
    def sneaky(): 
     def fget(self): 
      return self._sneaky 
     def fset(self, value): 
      self._sneaky = value 
     return locals() 
    sneaky = property(**sneaky()) 

+2

이 표기법을 사용할 때 flake8, pyflakes를 사용할 때 오류가 발생합니다. 나는 '우아한'경고의 기능을 재정의했다. – Stephan

+0

Pylint를 사용하면 데코레이터를 사용할 때 추가 이점이 있습니다. [보호 된 멤버를 액세스하는 속성으로 Pylint 경고'W0212'를 참조하십시오 : 피하는 법?] (http://stackoverflow.com/questions/24833362/pylint-warning-w0212-with-properties-accessing-a-protected-member- how-to-avoi). Pylint는 반환 된 값/객체를 검사 할 수있는 기능을 유지합니다. – Hibou57

관련 문제