접근제한자 (Access Modifier)

2020. 12. 14. 15:00·[Language] - Python

개요


이번 포스트에서는 파이썬의 접근제한자에 대해 다뤄보겠다. 파이썬을 사용하며 조금 익숙해질때 쯔음.. 무언가 이상한 점을 느꼈다. 왜 파이썬에서는 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
'[Language] - Python' 카테고리의 다른 글
  • 추상 베이스 클래스 (Abstract Base Class)
  • pickle 모듈
  • 정적 메소드 staticmethod, classmethod, instancemethod
  • 가변인자 args, kwargs
Bebsae
Bebsae
  • Bebsae
    뱁새zip
    Bebsae
  • 전체
    오늘
    어제
    • 분류 전체보기 (108)
      • [DevOps] - Kubernetes (5)
      • [DevOps] - AWS (1)
      • [AI] - Machine Learning (19)
      • [AI] - Neural Network (7)
      • [CS] - Network (2)
      • [CS] - Data Structure (3)
      • [CS] - Design Pattern (6)
      • [Language] - Python (15)
      • [Library] - Numpy (7)
        • Quick Start (5)
        • API (2)
      • [Framework] - Django (3)
      • [Framework] - QGIS (6)
      • [Framework] - PyQT (4)
      • [Mathematics] - Linear Alge.. (14)
      • [Mathematics] - Statistical (2)
      • [ETC] - Python (3)
      • [ETC] - C++ (1)
      • [ETC] - Linux (1)
      • 논문 (5)
      • 회고록 (3)
      • 생산성 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    분해
    linearalgebra
    QGIS
    디자인패턴
    decomposition
    Python
    교차검증
    Convolution
    Linear
    DEEPLEARNING
    MachineLearning
    파이썬
    Learning
    신경망
    Machine
    RNN
    선형대수
    머신러닝
    numpy
    algebra
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Bebsae
접근제한자 (Access Modifier)
상단으로

티스토리툴바