개요
이번 포스트에서는 파이썬의 접근제한자에 대해 다뤄보겠다. 파이썬을 사용하며 조금 익숙해질때 쯔음.. 무언가 이상한 점을 느꼈다. 왜 파이썬에서는 public, protected, private이라는 키워드를 본적이 없지?
일단 결론부터 얘기하면 파이썬에 접근제한자에 대한 키워드는 없다. 정답은 명명규칙에 있었다.
- 멤버(함수, 변수)명 앞에 _를 한 번 쓰면 protected
- 멤버(함수, 변수)명 앞에 _를 두 번 쓰면 private
주의할 점은 멤버명 뒤에 _를 두 번 쓰면 다시 public이 된다.
| public | member, member__, _member__, __member__ |
| protected | _member, _member_ |
| private | __member, __member_ |
예시
class Aa:
__prv = 1
__pub__ = 2
_pro = 3
pub = 4
@property
def prv(self):
return self.__prv
@prv.setter
def prv(self, value):
self.__prv = value
@property
def pro(self):
return self._pro
@pro.setter
def pro(self, value):
self._pro = value
a = Aa()
print(a.prv)
print(a.__pub__)
print(a.pro)
print(a.pub)
a.prv = 20
a.pro = 30
print(a.prv)
print(a.pro)
1
2
3
4
20
30
- @property, @<읽기 함수명>.setter 데코레이터는 각각 getter, setter를 편리하게 구현할 수 있다.
- @prv.setter의 prv는 앞에서 @property 데코레이터에 의해 정의된 함수명이다.
- getter, setter를 통해 특정 필드에 대한 읽기/쓰기 권한을 제어할 수 있다.
- 예를 들면, private으로 정의된 __prv 클래스 필드에 대해 @property 데코레이터로 읽기 전용 프로퍼티만 정의하고, @prv.setter 데코레이터를 정의하지 않으면 해당 필드에 대해서는 쓰기를 수행할 수 없게 된다.
- 설령 a.__prv = ?? 처럼 객체 a에 대한 __prv 라는 이름의 필드에 특정 값 혹은 객체를 할당하는 것은 가능하지만, 기존의 클래스 내부에 정의된 __prv와는 이름만 같고 전혀 다른 독립적인 필드가 생성된다. (즉, 클래스 내부에서만 제어가 가능하다.)
- 보다시피 뒤에 언더바(_)를 두 번 쓴 __pub__ 멤버는 public으로 처리되어 접근이 가능하다.
'[Language] - Python' 카테고리의 다른 글
| 덕 타이핑 (Duck Typing) (2) | 2020.12.29 |
|---|---|
| 추상 베이스 클래스 (Abstract Base Class) (0) | 2020.12.28 |
| pickle 모듈 (0) | 2020.12.18 |
| 정적 메소드 staticmethod, classmethod, instancemethod (0) | 2020.12.09 |
| 가변인자 args, kwargs (0) | 2020.12.09 |