접근제한자와 @property
접근제어자와 @property
property 데코레이터에 대한 공부를 하기 위해선 우선적으로 접근제한자를 알아야한다.
파이썬에는 java에서 기능하는 접근제한자라는 개념은 없지만 작명법으로 해당 기능을 구현할 순 있다.
접근제한자
기본적인 접근제한자 구조는 다음과 같다.
- public : 자유롭게 사용 가능
- protected : 해당 패키지(모듈) 내에서 또는 상속 관계에서 사용 가능
- private : 해당 객체 내에서만 사용 가능
파이썬은 위와 같은 접근제한자를 작명법을 통해 구현한다.
- public : 접두사에 언더바를 사용하지 않음
- protected : 접두사에 언더바 한 줄 사용
- public : 접두사에 언더바 두 줄 사용
get, set
java의 getter setter 와 마찬가지로 python 에서 또한 private 접근제한을 했다면 get set 을 통해 해당 속성에 접근할 수 있다.
class jungho:
def __init__(self,weight):
self.__weight = weight
self.weight2 = weight+10
def Get_weight(self):
return self.__weight
def Set_weight(self,weight):
self.__weight= weight
import GETSET1
yoon = GETSET1.jungho(70)
print(yoon.weight2)
# print(yoon.__weight) private 으로 지정했기 때문에 외부 모듈에서 호출 불가능
print(yoon.Get_weight())
yoon.Set_weight(77)
print(yoon.Get_weight())
80
70
77
인스턴스 필드명 앞에 언더바 두 개를 붙여줌으로서 private을 설정할 수 있고 get,set 함수를 통해 해당 필드에 접근할 수 있다.
그러나 이 코드는 파이썬 답지 않은 코드이다.
@property
@propert 데코레이터를 이용해 우리는 python 다운 멋진 코드를 사용할 수 있다.
class jungho:
def __init__(self,weight):
self.__weight = weight
self.weight2 = weight+10
@property
def weight(self):
return self.__weight
@weight.setter
def weight(self,weight):
self.__weight= weight
import GETSET1
yoon = GETSET1.jungho(70)
print(yoon.weight)
yoon.weight =77
print(yoon.weight)
70
77
이렇듯 get 의 역할은 @property 가 , set의 역할은 @필드명.setter 데코레이터가 기능한다.
별 것 아닌것 같지만 좀 더 python 다운 개발을 위해선 꼭 사용해야할 기능이다.
실제로 python 공식 문서에서도 접근제한자 작명법이 아닌 데코레이터의 사용을 강하게 권고한다.
댓글남기기