다양한 언더 스코어를 활용하면서 접근 지정자에 대해 알아보자.
헷갈렸던 내용이었는데 정리하면서 도움이 꽤 됐다.
- 인터프리터에서 마지막 값을 저장할 때
- 값을 무시하고 싶을 때
- 네이밍을 통해 클래스에서 접근 지정자가 달라지도록 하고 싶을 때
- 국제화, 지역화 함수로 사용하고 싶을 때
- 숫자 리터럴값의 자릿수 구분을 위한 구분자로써 사용할 때
강의에서는 국제화, 지역화, 자릿수 구분은 다루지 않아서 따로 공부 후 정리해보았다.
>>> 5
5
>>> _
5
>>> _ * 10
50
# unpacking : 값이 무시가 됨
x, _, y = (1,2,3)
print('ex 1>',x,y)
#packing 처리가 되서 무시가 됨
a, *_, b = (1,2,3,4,5)
print('ex 1>',a,b)
a, *i, b = (1,2,3,4,5) #위의 상황 출력해보기
print(a,i,b)
# for 문에서 변수를 무시할 때도 쓰임
for _ in range(10):
pass
for _, val in enumerate(range(10)):
pass
# index는 안쓰고 value만 쓰겠다
python 접근 지정자
name : public 변수
외부에서 접근 가능하다. 자유롭게 읽기, 쓰기가 허용된다.
_name : protected 변수
상속 관계에서 변수를 나타낼때 사용한다.
__name : private 변수
캡슐화를 통해 내부 처리 과정이 숨겨져있다
class sample:
def __init__(self):
self.x = 0 #public
self._y = 0 #protected
self.__z = 0 #private
a = sample()
# public, protected 변수는 출력이 잘 된다.
print('ex 1> x: {}'.format(a.x))
print('ex 1> y: {}'.format(a._y))
# private 변수는 에러 발생
print('ex 2> z: {}'.format(a.__z))
# error: AttributeError: 'sample' object has no attribute '__z'
print('ex 1>',dir(a))
#[ ... , '_sample__z', '_y', 'x']
⭐️ private 변수는 _(클래스)__(변수 이름)
다음과 같이 이름이 바뀌어서 정의되어 있다.
따라서 아래와 같이 출력과 직접 값 변경이 가능하다. 강제성은 없는 것이다.
그렇지만 약속된 규약이다. rule을 지키자
a._sample__z = 3
print('ex 1> z: {}'.format(a._sample__z))
직접 접근하지 말고, Getter, Setter를 통해 값 변경을 해주자.
class SampleB:
def __init__(self):
self.x = 0
self.__y = 0
# _sampleB__y 로 치환될 것임
def get_y(self): # getter
return self.__y
def set_y(self,value): #setter
self.__y = value
# ⭐️ 이렇게 getter, setter를 만들었지만 여전히 직접 접근해서 변경은 가능하다.
b.x=1
b.set_y(3)
print('ex 2> x={}, y={}'.format(b.x,b.get_y()))
print('ex 2 >',dir(b))
#get_y, set_y가 생겨있다.
class sample:
def __init__(self,value):
self.__IamPrivate = value
a = sample(1)
#IamPrivate = 1
a._sample__IamPrivate = 3
# 직접 접근해서 수정이 가능하다.
사실 위와 같이 언더스코어 두개를 사용해서 private 변수로 만들어도 직접 접근이 가능하다. 🤯
전세계 개발자들이 언더 스코어 두개로 정의한 변수는 사용하지 않는 암묵적인 규칙을 따르고 있다.
그냥 자율적인 약속을 따르고 있는 격이다.
이를 컨벤션이라고 부른다.
_
가 국제화/지역화 함수라는 의미는 아니며, i18n/l10n 함수를 _
로 바인딩하는 C 컨벤션에서 유래된 컨벤션이다.i18/i10 함수는 문자열 번역에 사용할 때 자주 사용됩니다.
국제화와 지역화가 필요한 웹 어플리케이션에서 자주 쓰인다.
특히 Django에서 자주 쓰인다고 한다!
from django.http import HttpResponse
from django.utils.translation import gettext as _
def my_view(request):
output = _("Welcome to my site.")
return HttpResponse(output)
#출처: Django Official Document
# 1000 단위로 표시할때
amount = 10_000_000.0
# 16진수를 단어별로 묶을때
addr = 0xCAFE_F00D
# 2진수를 끊어 읽고 싶을때
flags = 0b_0011_1111_0100_1110
# String 2진수를 변경
flags2 = int('0b_1111_0000', 2)
print(amount)
print(addr)
print(flags)
print(flags2)
print(flags - flags2)
>>> 10000000.0
>>> 3405705229
>>> 16206
>>> 240
>>> 15966
[ 출처 ]
1. 인프런 - 모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)
2. 파이썬 언더스코어(_)에 대하여
3. [Python] 특별한 언더스코어(_)