본문 바로가기

카테고리 없음

__init__.py는 왜 사용하는가?

 

어떤 역할을 하는가 ?

 

해당 패키지의 디렉토리를 표시하는데 사용됨. 해당 디렉토리가 파이썬의 패키지로 인식되도록.

어떤 폴더를 파이썬이 패키지로 인식하도록 하는데 쓰인다는 것 !

 

이 파일은 패키지 관리하는데 도움을 줌. 왜냐면 패키지 초기 설정을 여기서 수행함.

패키지 수준에서 사용할 변수, 함수, 클래스 등을 정의할 수 있음.

 

파이썬 패키지에서는 항상 __init__.py 안에 있는 내용을 먼저 실행하고 나서 (내가 만약 __init__.py 말고 다른 파이썬파일에 있다면) 내가 현재 있는 위치에 있는 코드를 실행해준다. 

 

__init__.py는 my_package라는 폴더 안에있고, main.py는 폴더 바깥에 있는 상황이다. 

print("my_package의 init 파일 실행됨.")
print("패키지가 초기화됩니다.")

from . import module_a, module_b

#패키지 수준의 변수 정의
package_variable = '이 변수는 패키지 전체에서 사용 가능'

#공용 함수정의
def common_function():
    print("package 공용 함수")

 

 

__init__.py 에서는 import module_a와 b를 모두 해놓았고, 공용 변수와 common_function()이라는 함수도 있다.

import my_package

# my_package.function_a()
# my_package.function_b()

my_package.module_a.function_a()
my_package.module_b.function_b()

#공용변수 활용가능
print(my_package.package_variable)

#공용함수 활용가능
my_package.common_function()

 

지금은 main_compare.py 안에 있는 코드다. my_package를 import 했다. 위에 주석처리한 my_package.function_a()는 실행되지 않는다. 저 함수는 module_a.py 안에 있는 함수라 한 번 더 .을 통해서 접근해줘야 한다. 

 

근데 package_variable이나 common_function()은 바로 안에있는애라 .하나로 접근 가능.

 

이 코드를 실행하면 

ㄴㅇㄹ

module_a 안에있는 a 함수가 제일 먼저 실행이 되어서 "function_a from module_a" 가 실행될 거 같지만 그렇지 않다.

 

__init__.py가 있기때문에 현재 my_package라는 폴더는 패키지로 인식이 되고 있음 

>> 그래서 패키지가 import 될 때 __init__.py가 가장 먼저 실행됨 !!

 

가장 먼저 실행되기 때문에 init 코드 중 맨 위에 있는 친구부터 실행되고 나서 main_compare.py가 실행된다. 

 

 

 

* 찾아보니 파이썬 3.3 이후버전부터는 던더 init 안넣어도 패키지로 인식 잘 하는데, 하위 버전과의 호환성이나 성능면에서 넣어주는 것이 좋다고 한다.