2013-04-17 3 views
1

클래스 내의 메소드는 property/setter 접근 자, 즉 "add_to_field"를 사용해야합니까? 아니면 private 변수에 직접 액세스해야합니까?Python 코딩 스타일 - 클래스 내부의 속성/설정자?

class Example(object): 
    def __init__(self, field): 
     self._field = field 

    @property 
    def field(self): 
     return self._field 

    @field.setter 
    def field(self, field): 
     self._field = field 

    def add_to_field(self, something): 
     self.field += something 

    def subtract_from_field(self, something): 
     self._field += something 

세터가 변수를 순전히 설정하지 않았지만 로깅과 같은 다른 작업을 수행 한 경우는 어떻습니까? 이 나쁜 스타일인가요?

@field.setter 
    def field(self, field): 
     log.logger.debug("Field set to %r", field) 
     self._field = field 

현재 내 코드는 둘 다 혼합되어 있습니다. 어떤 방향으로 리팩터링 할 것인지 모르겠다.

+5

초기 예제에서는 속성을 전혀 사용하지 않아야합니다. 그냥 일반 속성 액세스를 사용하십시오. – wim

답변

3

getter와 setter를 사용하지 않도록하는 주된 이유는 잠재적 인 무한 재귀 (foo 등을 호출하는 객체를 설정하는 foo 메소드를 setter가 호출 함)를 피하기 위해서입니다.

그렇지 않으면 getter/setter를 프로그램 데이터가 일관성있게 유지된다는 점에서 항상 getter/setter를 호출하는 것이 좋습니다.

제 조언은 항상 당신의 getter/setter를 사용하는 것입니다. 한 지점에서 복잡한 설정자가 시작되고 첫 번째 지점이 문제가되면 코드를 다시 생각하여 코드를 단순하게 유지해야합니다. 추가적인 방법은 세터에서 수행 된 모든 과중한 작업을 리펙토링 할 수 있습니다.

getter/setter가 정확하게 "반환 값"이고 "변수에 값 할당"인 경우 getter 또는 setter를 정의하면 안됩니다. 파이썬에서 좋은 점은 getter 또는 setter가 필요할 때 완전히 투명하게 처리 할 수 ​​있다는 것입니다. 예를 들어, C++의 경우 가끔 항상은 getters 및 setters를 통한 액세스 특성이 "더미"함수 인 경우에도 우수 사례로 간주됩니다.

요약 : 나는 add_to_field 스타일로 갈 것입니다.