[Python] Class - @property / @name.setter
@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
적용과정
-
접근자, 설정자 메서드의 이름은 변수이름으로 통일시킨다.
-
접근자 메서드에는
@property
를 적용 -
설정자 메서드에는
@{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