[Python] Class - @property / @name.setter

2 minute read

python-version-3.7.1

@property, @name.setter

[Python] Class - getter, setter 에서 접근자 method 와 설정자 method 에 대해서 다루었다.


  • 접근자(getter) : 접근 제한된 값에 접근을 할 수 있도록 해주는 메서드
    • @property
  • 설정자(setter) : 접근 제한된 값에 접근하여 수정할 수 있도록 해주는 메서드
    • @name.setter


@property@name.setter 는 위의 접근자, 설정자와 중요한 관계에 있다.

Decorator에 대해서는 아래의 포스트 참고
[Python] Decorator (1)
[Python] Decorator (2)


  • @property 로 메서드를 꾸며주게되면 그 메서드는 접근자가 된다.

  • @name.setter 로 메서드를 꾸며주게되면 그 메서드는 설정자가 된다.

@property 는 인스턴스 메서드에만 사용가능하다.
즉 클래스메서드에는 사용불가능하다. Python에서 자체적으로 지원하지않는다.


Example

class MakeCh:
    ch_num = 0
    def __init__(self, name):
        MakeCh.ch_num += 1
        self.__num = MakeCh.ch_num  # __ (double underscore) 를 num 앞에 붙였다.
        self.__name = name  # __ (double underscore)를 name 앞에 붙였다.
        
    def get_num(self):  # num 의 접근자
        return self.__num
        
    def set_num(self, num):  # num 의 설정자
        self.__num = num
        
    def get_name(self):  # name 의 접근자
        return self.__name
        
    def set_name(self, name):  # name 의 설정자
        self.__name = name

[Python] Class - Information Hiding (2) 에서 사용했던 예시코드이다.
간단하게 정보은닉된 인스턴스 변수에 접근하는 과정을 살펴보자.

ch_first = MakeCh('first')  # 인스턴스 생성

ch_first.get_num()  # 접근자로 인스턴스 변수 __num 에 접근
ch_first.get_name()  # 접근자로 인스턴스 변수 __name 에 접근
ch_first.set_num(777)  # 설정자로 인스턴스 변수 __num 값 변경
ch_first.set_name('Awesome')  # 설정자로 인스턴스 변수 __name 값 변경

접근자, 설정자 메서드로 위와같이 정보은닉된 인스턴스 변수에 접근가능하다.
위의 접근자, 설정자 메서드를 @property 를 적용해서 바꾸어보겠다.


  • @property 적용 예시코드
class MakeCh:
    ch_num = 0
    def __init__(self, name):
        MakeCh.ch_num += 1
        self.__num = MakeCh.ch_num  # __ (double underscore) 를 num 앞에 붙였다.
        self.__name = name  # __ (double underscore)를 name 앞에 붙였다.
        
    @property
    def num(self):  # num 의 접근자
        return self.__num
    
    @num.setter
    def num(self, num):  # num 의 설정자
        self.__num = num
        
    @property
    def name(self):  # name 의 접근자
        return self.__name
    
    @name.setter
    def name(self, name):  # name 의 설정자
        self.__name = name


적용과정

  1. 접근자, 설정자 메서드의 이름은 변수이름으로 통일시킨다.

  2. 접근자 메서드에는 @property 를 적용

  3. 설정자 메서드에는 @{name}.setter 를 적용



위의 과정을 적용시킬 경우, 차이점이 무엇인지 살펴보겠다.

ch_first = MakeCh('first')  # 인스턴스 생성

인스턴스를 생성하는 것까지는 차이점은 없다.
그러나, getter, setter 매서드 사용방법이 변수 자체에 접근하는 것과 같이 변경된다.

ch_first.num

>>> 1

ch_first.name

>>> 'first'

변수 자체에 접근하는 것 같아 보이지만 실제로는 getter 메서드를 통해 접근한 것이다.

ch_first.num = 777
ch_first.name = 'Awesome'

인스턴스 변수를 변경하였다.
변수 자체에 접근한 것처럼 보이지만 setter 매서드를 통해 값을 변경한 것이다.
실제로 값이 변경되었는지 확인해보자.

ch_first.num  # @property 접근자로 접근한 것이다. 변수로 접근한 것으로 착각 X

>>> 777

ch_first.name  # @property 접근자로 접근한 것이다. 변수로 접근한 것으로 착각 X

>>> 'Awesome'

인스턴스 변수값이 문제없이 변경되었음을 알 수 있다.


Conclusion

  • @property: getter
  • @{name}.setter: setter

  • 함수를 호출하는 것이 아닌, 변수를 다루는 것 처럼 사용한다.
    (→ 직관성, 간결성, 편의성)

Leave a comment