Python의 접근제어자
python의 접근제어자는 변수의 이름에 따라 public, private, protected로 구분한다. 하지만 실제로는 그렇지 않다.
Access Modifier 종류
기존 알고 있는 Python의 class에서 사용되는 변수명에 따른 접근제어자는 다음과 같다.
\ | prefix | postfix |
---|---|---|
public | var |
__var__ , _var__ |
private | __var |
__var_ |
protected | _var |
_var_ |
접미사(postfix)에 언더바가 2개 (
__
) 이상인 경우에 public으로 간주합니다.
정말로 접근이 제어될까 ?
여러 이름을 가지고 있는 class K
.
class K():
pub = 1
pub__ = 2
__prv = 3
__prv_ = 4
__prv__ = 5
_prt = 6
_prt_ = 7
_prt__ = 8
위에 나와있는 표에 따르면, __prv
, __prv_
는 private이기 때문에 접근할 수 없다. 실제로 접근을 해보아도 AttributeError
가 발생한다.
>>> k = K()
>>> k.pub
1
>>> k.pub__
2
>>> k.__prv
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'K' object has no attribute '__prv'
>>> k.__prv_
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'K' object has no attribute '__prv_'
>>> k.__prv__
5
>>> k._prt
6
>>> k._prt_
7
>>> k._prt__
8
정말로 접근할 방법이 없는지 dir()
함수로 들여다보자.
(dir()
함수가 무엇인지는 나중에 다루겠습니다. )
>>> dir(k)
['_K__prv', '_K__prv_', '__prv__', '_prt', '_prt_', '_prt__', 'pub', 'pub__'.. 생략]
위 class 정의에서 private
으로 설정한 __prv
와 __prv_
가 클래스 이름이 접두사가 붙은 _K__prv
, _K_prv_
로 바뀌어져있다. 혹시 바뀐 이름으로도 접근이 가능할까 ?
>>> k._K__prv
3
>>> k._K__prv_
4
그렇습니다. 접근이 가능합니다.
이름으로 강제 private 지정 ?
그렇다면 역으로 클래스이름을 접두사로 붙인다면 기존의 private 처럼 사용할 수 있을까?
class K():
__prv = 1
_K__my_prv = 2
def show(self):
print(self.__prv,self.__my_prv)
클래스 이름인 K
앞에 _
를 붙여서 _K__my_prv
변수를 만든다. __my_prv
와 작동이 같다고 가정하고, show()
메소드에서 __my_prv
으로 접근을 시도한다.
k = K()
k.show()
>>> 1, 2
예상처럼 __prv
의 1과 __my_prv
의 2가 출력된다.
_K__prv
와 __prv
가 동시에 쓰인다면 ?
class K():
__prv = 1
_K__prv = 2
def show(self):
print(self.__prv)
k = K()
k.show()
>>> 2
겹치는 경우에 당연히 가장 마지막에 선언된 변수가 덮어쓰게 된다.
결론
Python은 이름(naming)으로 변수의 접근을 제어한다. 하지만 외부에서 쉽게 접근할 수 없게 변수명만 바꾸는 것이지 실질적인 접근을 제어하지는 못한다. Python은 실제로 접근제어가 이루어지지 않는다.
'Dev > Python' 카테고리의 다른 글
[하루 1시간] 실시간 OCR 번역기 만들기 (1) | 2023.11.24 |
---|---|
[SublimeText] 플러그인 만들기 - URL Decoder (0) | 2022.01.08 |
카카오톡 챗봇 (2) (1) | 2017.12.22 |
카카오톡 챗봇 (1) (1) | 2017.12.15 |