1 분 소요

접근제어자와 @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 공식 문서에서도 접근제한자 작명법이 아닌 데코레이터의 사용을 강하게 권고한다.

댓글남기기