__init__
정말 자주 쓰이지만 제대로 알지 못했던 밑줄(underscore) 파이썬에서는 모두다 의미를 가지고 있습니다.
그래서 한 번 정리해보았습니다.
첫째. 네이밍 컨벤션
파이썬에서는 변수/함수명이 길어질 때 밑줄을 써서 가독성을 증가시킵니다. 일종의 네이밍 컨벤션(=명명방식)이죠. 영문으로는 snake_case라고 합니다.
def snake_case(super_lions, snake):
if type(super_lions) is list:
lion.append(snake)
return lion
둘째. 아무런 의미가 없는 변수명
인덱스 같이 딱히 의미없는 변수로 쓸 때 언더스코어를 활용할 수 있습니다.
for _ in range(5):
print("under_score")
셋째. Private
내부사용을 위한 메서드나 변수로 만들 수 있습니다.
예를 들어,
class PrivateTest:
_private_variable = "내부변수"
def _private_method(self):
print("나는 내부함수다")
def public_method(self):
print("나는 써도된다")
이런식으로 작성되어 있는 소스코드에서 외부사용자가 import를 시도하는 경우 호출이 되지 않습니다.
from privateTest import * #1번
from privateTest import _private_method #2번
from privateTest import public_method #3번
3번을 제외하고는 에러가 뜨게 됩니다. 물론...
test = privateTest()
a = test._private_method
print(a)
인스턴스화를 시켜준다거나 직접사용을 하는 경우는 문제없이 사용이 가능합니다.
넷째: 숫자 리터럴값의 구분자로 사용
역시 소스코드를 보시겠습니다.
test_num1 = 100_000_000
test_num2 = 100,000,000
print(test_num1)
print(test_num2)
두 번째 변수는 (100, 0, 0)으로 출력되지만 첫번째 변수는 제대로 인식이 되어 print가 잘 찍혀 나오게 됩니다.
첫째: 파이썬 맹글링
맹글링이란, 컴파일러나 인터프리터가 변수나 함수명을 일정한 규칙에 의해 변형시키는것을 말합니다.
클래스안에 메서드나 변수에 더블언더스코어를 활용해 이름을 짓는다면 이런 맹글링을 활용해 클래스 간의 상속 등을 시도할 때 동일속성 간 충돌을 방지할 수 있습니다.
class X:
def __double_method(self):
print("더블더블")
class Y:
def __double_method(self):
print("둘둘")
두 클래스의 메서드명이 보기에는 똑같아 보이지만 파이썬 인터프리터가 인식할때는 맹글링이 되어져 나오기때문에 다음과 같은 형태로 인식합니다.
print(dir(X()))
print(dir(X()))
_X_double_method
_Y_double_method
둘째. 매직 메서드
매직메서드란 __len__
더블언더스코어 두개로 감싸고 있는 형태로 이뤄진 함수를 말합니다.
클래스 안에 정의할 수 있는 스페셜 메서드이며, 클래스를 int, str, list 등과 같은 파이썬의 Built-in-type과 같은 역할을 할 수 있게 만들어 줍니다.
(물론 이미 매직메서드에는 다수의 빌트인 메서드도 포함하고있습니다.)
가장 유명한 매직메서드는 아무래도 __init__
생성자일겁니다. 생성자는 어떤 클래스의 인스턴스가 생성 될 때 파이썬 인터프리터에 의해 자동으로 호출되는 메서드입니다.
__call__
같은 메서드도 인식이 못하지만 굉장히 많이 쓰이는 메서드입니다. 파이썬에서 함수 호출할 때 쓰는 형식은 이렇습니다.
def test():
pass
t = test()
이렇듯 소괄호를 써서 호출하는 '형식'을 써야되는 이유는 파이썬 함수에 내장되어있는 __call__
이란 메서드의 기본형식이 소괄호를 써야되기 때문입니다.
실제로 __call__
이 없는 클래스를 똑같은 형식으로 호출하려 하면 에러가 발생합니다
test = TestClass()
test()
#TypeError : 'test' object is not callable