■ 패키지
패키지란 관련있는 모듈의 집합을 말한다. 패키지는 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다.
e.g) 가상의 game 패키지 만들기
game이라는 폴더를 만들고 game 폴더 안에 graphic, sound 폴더와 __init__.py파일을 생성하고 graphic, sound 폴더에 각각 __init__.py와 graphic에는 render.py, sound에는 echo.py를 만들었다고 가정해보자.
__init__.py 는 패키지를 표현하는 파이썬 파일이다. 그래서 이 파일 안에 패키지 관련 설정을 하는 곳이다. 만약 game, sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다. (python 3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식하지만, 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전하다.)
graphic의 render.py과 sound의 echo.py의 내용은 밑의 그림과 같다.
■ 패키지 안 함수 실행하기
(1) echo 모듈을 import하여 실행
>>> import game.sound.echo
>>> game.sound.echo.echo_test()
echo
(2) echo 모듈이 있는 디렉터리까지를 from ... import하여 실행
>>> from game.sound import echo
>>> echo.echo_test()
echo
(3) echo 모듈의 echo_test 함수를 직접 import하여 실행
>>> from game.sound.echo import echo_test
>>> echo_test()
echo
(4) echo 모듈의 echo_test 함수를 import하고 "e"라고 별명(?)붙혀주고 "e"로 함수 실행
>>> from game.sound.echo import echo_test as e
>>> e()
echo
■ 패키지 변수 및 함수 정의
패키지 수준에서 변수와 함수를 정의할 수 있다. 예를 들어, game 패키지의 __init__.py 파일에 공통 변수나 함수를 정의할 수 있다.
# game/__init__.py
VERSION = 3.5
def print_version_info():
print(f"The version of this game is {VERSION}.")
이렇게 패키지의 __init__.py 파일에 정의된 변수와 함수는 다음과 같이 사용할 수 있다.
>>> import game
>>> print(game.VERSION)
3.5
>>> game.print_version_info()
The version of this game is 3.5.
■ 패키지 내 모듈 미리 import
__init__.py 파일에 패키지 내 다른 모듈을 미리 import하여 패키지를 사용하는 코드에서 간편하게 접근할 수 있게 한다.
# game/__init__.py
from .graphic.render import render_test
VERSION = 3.5
def print_version_info():
print(f"The version of this game is {VERSION}.")
이제 패키지를 사용하는 코드에서는 다음과 같이 간편하게 game 패키지를 통해 render_test 함수를 사용할 수 있다.
>>> import game
>>> game.render_test()
render
■ "__all__"
- sound 안의 모든 모듈 다 가져오기
>>> from game.sound import *
>>> echo.echo_test()
echo
* 은 의미는 싹 다 불러오는 것을 의미한다. 예를 들어, from game.sound import * 는 game 안의 sound 폴더에 있는 파일들을 전부 불러오는 것을 의미한다. 하지만 *를 쓰려면 game 안의 sound폴더에 있는 init에 "__all__" 뭘 가져올 것인지 기록해야한다.
'Python > 파이썬 기초' 카테고리의 다른 글
[5-5] 내장함수 (0) | 2024.12.21 |
---|---|
[5-4] 예외 처리 (0) | 2024.12.21 |
[5-2] 모듈 (0) | 2024.06.30 |
[5-1] 클래스 (0) | 2024.06.30 |
[4-2] 사용자 입출력 (0) | 2024.06.30 |