Python 접근제어자

2018. 5. 28. 13:58·Dev/Python
Welcome file

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
'Dev/Python' 카테고리의 다른 글
  • [하루 1시간] 실시간 OCR 번역기 만들기
  • [SublimeText] 플러그인 만들기 - URL Decoder
  • 카카오톡 챗봇 (2)
  • 카카오톡 챗봇 (1)
우르슬라
우르슬라
    반응형
  • 우르슬라
    저장소
    우르슬라
  • 전체
    오늘
    어제
    • 분류 전체보기 (29)
      • AI (1)
      • Dev (17)
        • Python (5)
        • Javascript (3)
        • Tools (5)
        • React (1)
        • 공부 (1)
      • 메타버스2 (2)
      • NFT (0)
      • 판매용 (0)
      • IT 이슈 (2)
      • 금융 이슈 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ssml
    시스템프롬프트
    discord
    java se programmer
    ks54
    linyuvo ks54
    메타버스2
    clarksea
    랜드마크
    metaverse2
    deepseek
    oracle certified professional
    prompt enchance
    아젠다47
    javascript
    암호화폐차트
    화면 번역
    linyuvo
    랭그래프
    deepseek r1-lite-preview
    speech synthesis markup language
    NFT
    티스토리챌린지
    크립토트레이딩
    가상부동산
    hd중공업
    오블완
    agenda47
    프롬프트 강화
    wp engine 차단
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
우르슬라
Python 접근제어자
상단으로

티스토리툴바