ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Tip - 게터와 세터 메서드 대신 일반 속성을 사용
    언어/파이썬 & 장고 2016. 10. 29. 16:21

    다른 언어의 경우 게터와 세터 메서드를 명시적으로 구현하여 사용합니다. 하지만 파이썬에서는 명시적인 게터와 세터를 구현할 일이 거의 없습니다. 클래스의 변수들의 접근제어자를 public으로 할 경우 쉽게 접근할 수 있습니다. 또한 나중에 속성을 설정할 때 특별한 동작이 일어나야 하면 @property 데코레이터와 이에 대응하는 setter 속성을 사용하는 방법으로 바꿀 수 있습니다. 

    class Resistance:
        def __init__(self):
            self._data = 10
    
        @property
        def data(self):
            return self._data
    
        @data.setter
        def data(self, val):
            self._data = val
            self.current = self._data * 10
    
    res = Resistance()
    print(res.data)
    res.data = 20
    print(res.current)
    
    # 결과
    # 10
    # 200


    @property의 가장 큰 단점은 속성에 대응하는 메서드를 서브클래스에서만 공유할 수 있다는 점입니다. 서로 관련이 없는 클래스는 같은 구현을 공유하지 못합니다. 하지만 파이썬은 재사용 가능한 프로퍼티 로직을 비롯해 다른 많은 쓰임새를 가능하게 하는 디스크립터(descriptor)도 지원합니다.

    마지막으로 @property 메서드로 세터와 게터를 구현할 때 예상과 다르게 동작하지 않게 해야 합니다. 

    최선의 정책은 @property.setter 메서드에서만 관련 객체의 상태를 수정하는 것입니다. 모듈을 동적으로 임포트하거나 느린 헬퍼 함수를 실행하거나, 비용이 많이 드는 데이터베이스 쿼리를 수행하는 일처럼 호출하는 쪽이 객체에서 일어날 것이라고 예측하지 못할 만한 다른 부작용은 모두 피해야 합니다. 사용자는 다른 파이썬 객체가 그렇듯이 클래스의 속성이 빠르고 쉬울 거라고 기대할 것입니다. 더 복잡하거나 느린 작업은 일반 메서드로 작업해야합니다.

    요약

    간단한 공개 속성을 사용하여 새 클래스 인터페이스를 정의하고 세터와 게터 메서드는 사용하지 않아야 함

    객체의 속성에 접근할 때 특별한 동작을 정의하려면 @property를 사용

    @property 메서드에서 최소 놀람규칙을 따르고 이상한 부작용은 피하는 것이 좋음

    @property 메서드가 빠르게 동작하도록 만들어야 함. 느리거나 복잡한 작업은 일반 메서드로 하는 것이 좋음

    기존의 인스턴스 속성에 새 기능을 부여하려면 @property를 사용

    @property를 사용하여 점점 나은 데이터 모델로 발전

    @property를 너무 많이 사용한다면 클래스와 이를 호출하는 모든 곳을 리팩토링하는 방안을 고려


    댓글