오식랜드
[python] package 본문
package
파이썬에서는 여러 모듈들을 모아 놓은 집합을 패키지라고 하며, 패키지는 보통 하나의 폴더 안에 여러 모듈 파일들로 구성됩니다.
패키지 만들기
신규 여행사 관련 프로젝트를 담당하게 되었다고 가정하겠습니다. 이 여행사는 태국과 베트남, 일본 패키지 여행 상품을 제공합니다.
새로운 폴더를 하나 만들고 이름은 travel 로 하여 새로운 패키지를 생성합니다.
그리고 travel 폴더 밑에 파일을 4가지 만들어줍니다.
- 태국 패키지 상품을 위한 모듈인 thailand.py 파일
- 베트남 패키지 상품을 위한 모듈인 vietnam.py 파일
- 일본 패키지 상품을 위한 모듈인 japan.py 파일
- 패키지 설정을 위한 init.py 파일
그리고 패키지를 불러올 파일을 하나 만들어줍니다.
아래와 같은 폴더 구조로 두면 됩니다.
package
- package_test.py
- travel
- thailand.py
- vietnam.py
- japan.py
- init.py
그리고 travel폴더 내의 파일들에는 각자 class를 선언해주고 그 안에 detail함수를 선언해주자
class ThailandPackage:
def detail(self):
print('태국 여행 패키지')
class VietnamPackage:
def detail(self):
print('베트남 여행 패키지')
class JapanPackage:
def detail(self):
print('일본 여행 패키지')
패키지 import
그리고 package_test.py 안에서 패키지를 import해보자
- from 폴더명.파일명 as 별명
import travel.japan as japan
이렇게 쓰면 travel폴더 내의 japan.py 파일을 japan이라는 별명으로 불러올 수 있다
그리고 변수에 japan.py안의 JapanPackage 클래스를 저장해주자
jp = japan.JapanPackage()
그리고 japan.py의 JapanPackage 클래스 내의 detail함수를 불러올 땐 변수명.함수명()으로 호출할 수 있다
jp.detail()
# '일본 여행 패키지' 출력
- from 폴더명 import 파일명
이번엔 베트남 정보를 알아보자
import방법은 패키지 중 하나의 모듈을 불러오도록 해보자
from travel import vietnam
vn = vietnam.VietnamPackage()
vn.detail()
# '베트남 여행 패키지' 출력
어떤 대상을 import 하느냐에 따라서 대상 내에 접근하기 위한 코드도 달라져야 한다는 점을 주의해야합니다.
- from 폴더명 import *
우리는 random 모듈을 import 할 때 * 를 사용함으로써 random 모듈 내의 모든 것을 가져다 쓸 수 있다고 공부한 적이 있습니다.
from random import *
travel 패키지도 같은 방식으로 한 번 사용해볼까요?
from travel import * 을 함으로써 travel 패키지의 모든 것을 가져다 쓰겠다고 하고 나서 ThailandPackage 객체를 만들어보겠습니다.
from travel import *
tl = tailand.ThailandPackage () # 베트남
tl.detail()
실행시켜보니 다음과 같이 tailand가 정의되지 않았다며 에러가 발생하네요.
NameError: name 'tailand' is not defined
왜 그럴까요?
- 을 쓴다는 것의 의미는 travel 이라는 패키지에 있는 모든 것을 가져다 쓰겠다는 것인데, 실제로는 패키지를 만든 사람이 공개 범위를 설정해줄 수가 있답니다.
즉, 패키지에 포함된 모듈 중에서 import 되기를 원하는 것만 공개를 하고 나머지는 비공개로 둘 수가 있는 거예요.
travel 패키지를 만들 때 함께 생성했던 init.py 파일을 열어서 다음과 같이 내용을 작성하겠습니다.
__all__이라는 변수에 리스트 형태로 공개하려는 모듈 이름을 추가하면 해당 모듈에 대해 공개 설정을 할 수 있게 됩니다.
이 때, __all__앞 뒤로 밑줄은 2번씩 적어주셔야 한다는 점 주의해주세요.
__all__ = ["thailand"] # thailand 모듈 공개
그리고 다시 package_test.py 폴더에서 코드를 실행해봅시다
from travel import *
tl = thailand.ThailandPackage() # 태국
tl.detail()
# '태국 여행 패키지' 출력
정상적으로 작동하는걸 확인할 수 있습니다.
다만, all 리스트에 japan이나 vietnam은 포함되어있지 않으니 에러가 납니다.
공개와 비공개를 적절히 때에 맞게 잘 설정하면 됩니닷
'dev-log > python' 카테고리의 다른 글
[python] pip install (0) | 2023.01.12 |
---|---|
[python] module 직접 실행 (0) | 2023.01.12 |
[python] module (0) | 2023.01.12 |
[python] class (0) | 2023.01.12 |
[python] 파일 입출력 (0) | 2023.01.09 |