파이썬에서 쓰이는 밑줄의 의미

김기욱·2020년 12월 16일
0
post-thumbnail

__init__

정말 자주 쓰이지만 제대로 알지 못했던 밑줄(underscore) 파이썬에서는 모두다 의미를 가지고 있습니다.
그래서 한 번 정리해보았습니다.

SigleUnderScore(밑줄하나)

첫째. 네이밍 컨벤션

파이썬에서는 변수/함수명이 길어질 때 밑줄을 써서 가독성을 증가시킵니다. 일종의 네이밍 컨벤션(=명명방식)이죠. 영문으로는 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가 잘 찍혀 나오게 됩니다.

DoubleUnderScore(밑줄두개)

첫째: 파이썬 맹글링

맹글링이란, 컴파일러나 인터프리터가 변수나 함수명을 일정한 규칙에 의해 변형시키는것을 말합니다.

클래스안에 메서드나 변수에 더블언더스코어를 활용해 이름을 짓는다면 이런 맹글링을 활용해 클래스 간의 상속 등을 시도할 때 동일속성 간 충돌을 방지할 수 있습니다.

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 
profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글