- c++, java 등의 기타 OOP 언어와는 달리, 파이썬의 경우 restricted한 제한자 적용을 할 수 없음
- 파이썬에서의 모든 속성, 메소드는 기본적으로 public
- 즉, 클래스의 외부에서 속성, 메소드에 접근이 가능 (사용가능)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class Bottle: def __init__(self, quantity): self.quantity = quantity def fill(self, quantity): self.quantity = quantity def empty(self): self.quantity = 0 def show(self): print '{}ml inside the bottle'.format(self.quantity) bottle = Bottle(20) bottle.show() bottle.fill(100) bottle.show() bottle.empty() bottle.show() bottle.quantity = 20 bottle.show() <<<<< 실행결과 >>>>> 20ml inside the bottle 100ml inside the bottle 0ml inside the bottle 20ml inside the bottle | cs |
Protected
- 해당 클래스와 그것의 하위 클래스에서만 접근 가능
- 파이썬에서는 해당 속성의 앞에 _(single underscore)를 붙여서 해결
- 실제 runtime에서의 제약사항은 아니고, 실제 클래스를 사용하는 사용자에게 경고 형태로만 제공
- 파이썬에서 protect는 기능은 하지만 그저 경고하는 것에 지나지 않음..마음대로 써라.. 하지만 책임은 지지 않겠다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | class Bottle: def __init__(self, quantity): self._quantity = quantity def fill(self, quantity): if self._quantity + quantity > 100: self._quantity = 100 else: self._quantity += quantity def empty(self): self._quantity = 0 def show(self): print '{}ml inside the bottle'.format(self._quantity) bottle = Bottle(20) bottle.show() bottle.fill(40) bottle.show() bottle.fill(50) bottle.show() ## 100ml 이상 담을 수 없게 구현했으나, 사용자가 마음대로 외부에서 설정 bottle._quantity = 2000 bottle.show() bottle.fill(2000) bottle.show() <<<<< 실행결과 >>>>> 20ml inside the bottle 60ml inside the bottle 100ml inside the bottle 2000ml inside the bottle 100ml inside the bottle | cs |
private
- 해당클래스의 외부에서는 접근 불가능
- 파이썬의 경우 속성이름 앞에 __(double underscore)를 붙여서 private 속성으로 설정
- name mangling을 통해 속성의 이름을 변경하는 기법으로 private로 설정
- 해당 속성의 경우 클래스의 외부에서 접근할 경우 에러 발생
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class Bottle: def __init__(self, quantity): self.__quantity = quantity def fill(self, quantity): if self.__quantity + quantity > 100: self.__quantity = 100 else: self.__quantity += quantity def empty(self): self.__quantity = 0 def show(self): print '{}ml inside the bottle'.format(self.__quantity) bottle = Bottle(20) bottle.fill(100) bottle.empty() bottle.show() ### 아무런 변화를 주지 못한다 bottle.__quantity = 3000 bottle.show() ### name mangling으로 속성의 이름을 변경 bottle._Bottle__quantity = 3000 bottle.show() <<<<< 실행결과 >>>>> 0ml inside the bottle 0ml inside the bottle 3000ml inside the bottle | cs |
반응형
'Python > Python Basic' 카테고리의 다른 글
Decorator_02 (파라미터가 있는 함수 decorator & 모든 함수에 대한 decorator) (0) | 2017.09.30 |
---|---|
Decorator_01 (Nested function, Closure) (0) | 2017.09.30 |
Class] 1. __init__ & method (0) | 2017.06.15 |
1. Series (0) | 2017.05.30 |
Day5) 4. import/from import (0) | 2017.05.25 |