0. Introduction
- 지난 Chapter Python basic 43: Underscore 의 access modifier에 대한 개념을 먼저 이해해야 한다.
class 내의 attribute를 관리하기 위해서 2가지 방법을 가진다.
- 첫 번째: 이 attribute data에 직접 접근하여 변경하기: Python basic 43: Underscore
- 두 번째: method를 통해 접근하여 변경하기: Method 활용하여 Getter, Setter 작성
이번 Chapter에서는 두 번째 방법에 대해 알아본 후, property로 이를 구현해본다.
1. Method 활용하여 Getter, Setter 작성
Method를 활용하여 data에 접근하는 이유
access modifier로 구분한 data에 직접 접근하기보다는 class 내의 method를 통해서 접근하는 것이 side effect를 고려했을 때 현명한 방법이다.
그래서 data에 접근하기 위한 method인
Getter (=accessor)
와Setter(= mutator)
에 대해 작성해보겠다.
|
|
dir()
를 통해서 private variable은 naming mangling이 일어난 걸 알 수 있다.- method
get_y
와set_y
를 확인할 수 있다.
2. Property
2.1 Property란??
공개적으로 노출된 API를 변경하지 않고도 class 내부의 attribute의 기본 구현을 변경할 수 있는 도구
- 위 방식의 문제점
- 위 방식은 접근하려는 변수의 수가 만약 10개라면 각 변수에 대해 method를 작성해야한다.
- 객체 지향 설계의 캡슐화를 깨뜨린다.
- 그래서 Python에서는 위 방식보다 간편하고 안전한 도구를 제공하는데, 바로
property
다. property
는- 속성 같이 행동하는 method를 만든다.
- getter와 setter method를 피하는 pythonic way로, 내부 method를 외부에 노출시키는 것 없이 구현(Implementation)할 수 있다.
2.2 Property의 구현 방식 2가지
function으로서 Property( ) 와 decorator로서 @property
function으로 property 방법은 Real Python - Python’s property(): Add Managed Attributes to Your Classes - Getting Started With Python’s property()를 참고한다.
전자보다 후자인 decorator 로서의 property 를 사용하는 방식이 보다 Pythonic way 이며, Python open source community에서 가장 유명한 방법 이다.
@property
는Python 2.4
부터 가능해진 방식이다.
2.3 @property
|
|
- 그러면 위 파일을 import하여 실행해보자.
|
|
- 또한 property 내의 docstring을 출력할 수 있다.
- 출력되는 내용은
@property
가 붙은 method 안에 docstring이다.
|
|
docsting으로 property에 대해 달고 싶으면
@property
decorator가 붙는 method에 작성해야 한다는 걸 확인했다.그러면 마지막으로 제약조건을 추가하여 사용해보자.
@radius.setter
에 제약조건을 추가한다.
|
|
- 똑같이 import하여 실행해보자.
- 의도한대로 ValueError가 뜨는 걸 확인할 수 있다.
|
|
2.4 Summary
@property
는getter
method를 decorate 한다.- docstring의 위치는
@property
안에 입력해야 한다. setter
와deleter
method는getter
method name에.setter
그리고,.deleter
로 추가하여 decorate 된다.