Post

__init__

__init__py

__init__.py 파일은 Python에서 특별한 용도로 사용되며, 주로 두 가지 주요 기능을 수행한다.

  • 패키지 초기화: Python에서 디렉토리를 모듈처럼 가져올 수 있게 만든다. 이 파일이 있는 디렉토리를 Python 패키지로 인식하게 해서, 그 안의 모듈들을 구성하고 사용할 수 있게 한다.
  • 네임스페이스 관리: 패키지를 가져올 때 초기화 코드를 실행하거나, 패키지 레벨에서 공용 변수를 정의하는 등의 작업을 할 수 있게 한다.

기본 기능

__init__.py 파일이 있는 디렉토리는 Python에 의해 패키지로 간주된다. 이 파일이 없으면, Python 3.3 이전 버전에서는 해당 디렉토리가 단순한 디렉토리로 인식되어, 모듈로서의 기능을 수행할 수 없다. Python 3.3 이후부터는 Implicit Namespace Packages라는 개념이 도입되어 __init__.py 파일 없이도 디렉토리를 패키지로 인식할 수 있게 되었지만, 이 파일을 사용하여 패키지 초기화와 관련된 명시적인 작업을 수행하는 것이 여전히 유용하다.

예시

1
2
3
4
5
6
7
8
my_package/
    __init__.py
    submodule1.py
    submodule2.py
    subpackage/
        __init__.py
        submodule3.py
main.py

여기서 my_package와 subpackage는 각각 init.py 파일을 포함하고 있어 Python 패키지로 인식된다.

  • my_package/__init__.py
1
2
3
print("Initializing my_package")

__all__ = ["submodule1", "submodule2"]

이 파일은 my_package를 처음 가져올 때 실행되며, my_package 내의 submodule1과 submodule2만이 기본적으로 가져오기 명령(from my_package import *)에 의해 가져올 수 있도록 설정한다.

  • my_package/submodule1.py
1
2
def foo():
    print("This is foo() from submodule1")
  • my_package/submodule2.py
1
2
def bar():
    print("This is bar() from submodule2")
  • my_package/subpackage/__init__.py
1
print("Initializing subpackage")

이 파일은 subpackage를 처음 가져올 때 실행된다. 여기에는 추가 초기화 코드나 all 정의 등이 포함될 수 있다.

  • my_package/subpackage/submodule3.py
1
2
def baz():
    print("This is baz() from submodule3")
  • main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
# my_package의 모듈들을 불러옵니다.
from my_package import submodule1
from my_package.submodule2 import bar
from my_package.subpackage import submodule3

# submodule1의 foo 함수를 호출합니다.
submodule1.foo()

# submodule2의 bar 함수를 직접 호출합니다.
bar()

# subpackage 내의 submodule3의 baz 함수를 호출합니다.
submodule3.baz()
This post is licensed under CC BY 4.0 by the author.