__init__.py
“Python파일” = 모듈
“폴더” = “python파일”의 집합 = 모듈의 집합 => Package
Package의 root 디렉토리 = game 폴더
Package의 Sub디렉토리 = sound, graphic, play 폴더
python 3.3 version이상은 __init__.py 파일이 없어도, 패키지로 인식(PEP 420)
__init__.py 활용
해당 “폴더” 가 패키지의 일부임을 인식하도록 하는 역할
❯ set PYTHONPATH=~/my/py/doit
❯ python
>>> import game.sound.echo
>>> game.sound.echo.echo_test()
echo
>>> from game.sound import echo
>>> echo.echo_test()
echo
>>> from game.sound.echo import echo_test
>>> echo_test()
echo
하지만, from없이 import만 사용할때는 가장 마지막 항목인 echo_test자리에는 반드시 Module 또는 Package여야만 한다.
>>> import game.sound.echo.echo_test
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'game.sound.echo.echo_test'; 'game.sound.echo' is not a package
import game을 수행하면 game 디렉터리의 __init__.py
에 정의한 것만 참조하므로 에러가 발생한다.
>>> import game
>>> game.sound.echo.echo_test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'sound'
패키지 내 모듈을 미리 import
예1>
# game/__init__.py
from .sound import echo
>>> import game
>>> game.sound.echo.echo_test()
echo
예2>
# game/__init__.py
from .sound.echo import echo_test
>>> import game
>>> game.echo_test()
echo
공통 변수나 함수를 정의
예>
# game/__init__.py
VERSION = 3.5
def print_version_info():
print(f"The version of this game is {VERSION}.")
>>> import game
>>> print(game.VERSION)
3.5
>>> game.print_version_info()
The version of this game is 3.5.
패키지를 초기화(기본값 설정하기)코드 또는 관련된 설정
예>
# game/__init__.py
print("Initializing game ...")
>>> import game
Initializing game ...
__all__
- 특정 디렉터리의 모듈을 *를 이용하여 import할 때에는 다음과 같이 해당 디렉터리의 init.py 파일에 all이라는 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다. all로 정의하지 않으면 인식되지 않는다.\
# __init__.py
__all__ = ['echo']
- 여기에서 all이 의미하는 것은 sound 디렉터리에서 * 기호를 사용하여 import할 경우 이곳에 정의된 echo 모듈만 import된다는 의미이다.