: 필요한 부품처럼 부분 부분 나뉘어져 잘 만들어진 파일, ex 자동차 타이어, 범퍼 등 부품만 교체, 추가 할 경우, 필요한 부분만 수정, 교체 가능.
: 코드의 재사용, 변경이 용이함, 확장자는 .py
- workspace 그룹에서 New File 선택 후, 임의 모듈(theater_module.py) 생성
# 영화 가격 모듈 생성
# 일반 가격
def price(people):
print("{0}명 가격은 {1}원 입니다." .format(people, people * 10000))
# 조조 할인 가격
def price_morning(people):
print("{0}명 조조할인 가격은 {1}원 입니다." .format(people, people * 6000))
# 군인 할인 가격
def price_soldier(people):
print("{0}명 군인 할인 가격은 {1}원 입니다." .format(people, people * 4000))
- 정상가격, 조조할인가격, 군인할인가격에 대한 함수 생성 후, 실제 작업용 py로 이동(practice.py 등)
* 해당 모듈 적용은 같은 workspace 나 같은 폴더내에 존재해야함.
1-1. 모듈 호출방법 1
import theater_module
theater_module.price(3) # 3명이서 영화 보러 갔을 때 가격
theater_module.price_morning(4) #4명이서 조조할인 영화 보러 갔을 때 가격
theater_module.price_soldier(5) #5명의 군인이 영화 보러 갔을 때 가격
'''결과 값 :
3명 가격은 30000원 입니다.
4명 조조할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
'''
- import + module 명 (ex, import theater_module)
- module 명 . 함수명 (ex, theater_module.price(3))
- 실제 practice.py에 함수 정의가 되지 않아도 다른 모듈에서 정의된 함수를 호출 할 수 있음.
* 나도코딩님의 경우, 해당 함수 모듈 호출 시 정상동작하였으나, 실제 테스트를 할 때에는 price 함수 등이 정의되지 않았다는 메세지가 발생하였다. theater_module.py 를 save 또는 실행( 삼각형, Run Python file in terminal) 후, 정상적으로 호출되었다.
1-2. 모듈 호출 방법 2(module 명 대신 별병(별칭) 사용)
import theater_module as mv # 별칭을 통해 줄여서 사용할 수 있음.
mv.price(3)
mv.price_morning(4)
mv.price_soldier(5)
''' 결과 값 :
3명 가격은 30000원 입니다.
4명 조조할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
'''
- as 를 통해 module 명을 간략화 할 수 있고, 호출이 많아 질 경우 더욱 간편하게 사용가능하다.(결과 값 동일)
1-3. 모듈 호출 방법 3( from module명 import *) / 1-1 과 비교
from theater_module import * # 모듈 명 없이 해당 함수를 사용가능
#from random import * # 기존에 random 함수 호출 시 사용
price(3)
price_morning(4)
price_soldier(5)
''' 결과 값 :
3명 가격은 30000원 입니다.
4명 조조할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
'''
- from module명 import * 형태로 모듈을 불러 올 경우, 모듈명 표기 없이 함수를 바로 호출 가능함(price(3))
- import * 의 경우, module의 모든 함수를 호출 할 수 있음.
- 1-1 import module명 으로 나타낼 경우에는 module명.함수명 형태로 호출(ex, theater_module.price(3))
1-4. 모듈 호출 방법 4(특정 함수만 import 할 경우)
from theater_module import price, price_morning # 처럼 필요한 함수만 가져 올 수 있음.
price(5)
price_morning(6)
price_soldier(7) # error 발생함
''' 결과 값 :
5명 가격은 50000원 입니다.
6명 조조할인 가격은 36000원 입니다.
Traceback (most recent call last):
File "d:/python/workspace/practice.py", line 37, in <module>
price_soldier(7) # error 발생함
NameError: name 'price_soldier' is not defined
'''
- import 뒤에 필요한 함수만 기입하여 호출할 수 있음.
- price_soldier의 경우, import 하지 않았으므로, 호출 시, 정의되지 않았다는 오류 메세지가 발생함.
1-5. 모듈 호출 방법 5(특정 함수 별명(별칭))
from theater_module import price_soldier as price
# price_soldier만 가져와서 별칭을 설정할 수 있음.
# theater_module 의 price_soldier 의 별칭을 price으로 설정함.
# 호출 시, 적용되는 price 함수는, theater_module의 price 함수가 아닌 price_soldier가 적용됨.
price(5)
# 결과 값 : 5명 군인 할인 가격은 20000원 입니다.
- module의 특정 함수만 호출 할 수 있음.
- import된 함수의 별칭 사용가능함.
: 모듈의 집합 하나의 디렉토리에 여러 모듈을 모아둔 것
# 패키지 실습 : 해외 여행
- 1. New Folder 를 이용하여 travel workspace 를 생성
- 2. 생성된 Folder 하위단에 New File 을 이용하여, __init__.py, thailand.py, vietnam.py 파일을 생성
- 3. thailand.py 안에 ThailandPackage class 생성
class ThailandPackage:
def detail(self):
print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원")
- 4. vietnam.py 안에 Vietnam.pyPackage class 생성
class VetnamPackage:
def detail(self):
print("[베트남 패키지 3박 5일] 다낭 효도 여행 60만원")
- 5-1. 작업 py(practice.py)에서 해당 travel package를 import 방법 1
import travel.thailand # 모듈이나 패키지만 가능, 클래스, 함수는 직접 import 불가
trip_to = travel.thailand.ThailandPackage() # 패키지의 class 함수 사용 가능
trip_to.detail()
# 결과 값 : [태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원
- 생성된 travel(workspace).thailand(module명) 을 import
* import module 의 경우, 1-1 과 같이 import 된 모듈을 함수앞에 표기해 주어야함.
- import 뒤에는 module, package 만 가능. class 와 함수는 사용불가.
- import travel.thailand.ThailandPackage 의 형태는 사용 불가. ThailandPackage가 class 이므로 적용 할 수 없음.
* import 에서 사용을 원할 경우, 위의 코딩과 같이 변수 선언 후, module+함수 형태로 사용가능.
- 함수 테스트 시 class 뒤에 바로 함수 호출로도 사용이 가능하나, 편의를 위해 변수를 생성한 것으로 생각됨.
ex) trip_to = travel.thailand.ThailandPackage().detail() 또는 변수 선언 없이 travel.thailand.ThailandPackage().detail()만 작성하여도 동일한 출력이 가능하다.
- 5-2. 작업 py(practice.py)에서 해당 travel package를 import 방법 2
# import travel.thailand 와는 달리 from + module명 + import 에서는 class 호출도 가능함.
from travel.thailand import ThailandPackage # 모듈 패키지 클래스 함수 모두 가능
trip_to = ThailandPackage()
trip_to.detail()
# 결과 값 : [태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원
- 5번 코딩과 동일한 내용이며, import + module명 대신 from + module명 + import 를 사용하기 때문에 class 나 함수도 호출 가능하다.
- 6. from + workspace 명 + import + module 명(5-2 와 같은 형태로 표현할 수 있음)
from travel import vietnam # module 명으로도 import 가능
trip_to = vietnam.VetnamPackage() # module 명으로 호출했기 때문에 해당 module 내 class 호출 필요
trip_to.detail()
# 결과 값 : [베트남 패키지 3박 5일] 다낭 효도 여행 60만원
- from + import 의 경우, 5-2, 6 의 코딩에서와 같이 package, module, class, 함수 모두 처리 가능하다.
- 7. import * (실행 시 오류 발생)
from travel import * # 공개 범위 설정 해주어야함
trip_to = vietnam.VetnamPackage() # 공개 범위 설정 해주어야함
trip_to.detail()
''' 결과 값 :
trip_to = vietnam.VetnamPackage()
NameError: name 'vietnam' is not defined
'''
* 앞선 강의간, from random import * 은 random module의 모든 함수를 사용하는 것으로 사용하였으나,
동일한 방법으로 from travel import * 을 사용하면 위와 같은 error 메세지가 발생한다.
import * 은 모듈(패키지)의 모든 함수를 사용한다는 내용이지만, 실제 사용하는 모든 함수에 대한 구분이 필요하다.
이 구분을 통해 사용자에게 사용 여부에 대한 권한이 필요하다.
- 8. __init__.py 설정
__all__ = ["vietnam"] # 모듈 이름
- __init__py 를 생성하는 이유는
- __all__ = []
- __all__ 리스트에 vietnam (모듈 이름) 을 추가 해주면 동일한 7번 코드 실행 시에도 정상동작한다.
- __init__.py 설정 후, 7번 코딩 실행.
from travel import *
trip_to = vietnam.VetnamPackage()
trip_to.detail()
# 결과 값 : [베트남 패키지 3박 5일] 다낭 효도 여행 60만원
- 9. module 직접 실행
class ThailandPackage:
def detail(self):
print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원")
# if 문을 이용해서 외부인지 내부에서 실행인지 확인 할 수 있음.
if __name__ =="__main__" :
print("Thailand 모듈을 직접 실행")
print("이 문장은 모듈을 직접 실행할 때만 실행돼요")
trip_to = ThailandPackage()
trip_to.detail()
else :
print("Thailand 외부에서 모듈 호출")
- if 문을 통해 해당 module이 module 내에서 실행되었는지, 외부에서 실행되었는지 확인 할 수 있다.
- 9-1. 내부에서 호출(직접 호출)
- 9-2. 외부에서 호출
- __name__ : 현재 모듈의 이름을 담고있는 내장 변수
- __main__ : 직접 실행된 모듈(모듈의 이름(파일명)을 가지게 된다.)
- __name__ == __main__ 일 경우, 내부 호출로, 다를 경우 외부 호출로 출력문이 다르게 나오는 걸 확인 할 수 있다.
- 해당 if문을 통해 실제 적용 하기 전 내부에서 테스트가 가능하다.
import inspect
import random
from travel import * # 공개 범위 설정 해주어야함
print(inspect.getfile(random)) # randdom 모듈의 위치 확인
print(inspect.getfile(thailand))
''' 결과 값 :
D:\python\workspace>D:/Python38/python.exe d:/python/workspace/practice.py
Thailand 외부에서 모듈 호출
D:\Python38\lib\random.py
d:\python\workspace\travel\thailand.py
'''
- 현재 작업 진행 중인, practice.py 모듈에 모듈 위치를 확인할 수 있는 inspect 모듈 import
- random, travel module을 각각 getfile을 이용하여 출력하면 Python38\lib 와 python\workspace\travel 로 2 모듈의 위치가 다름을 알 수 있다.
3-1. 실제 모듈 위치 변경(복사, 및 이동)
- travel workspace 에서 우측 마우스 클릭 후, 탐색기를 실행.
- 해당 폴더 전체를 복사한다.
- 복사된 폴더를 원하는 위치(D:\Python38\lib\) 에 붙여넣기 한다.
- 붙여 넣기 후, 기존의 travel workspace 의 이름을 travel_temp로 변경 한 후, 처음 위치를 확인했던 practice.py 모듈에서 동일한 코딩으로 위치를 확인한다.
- travel 모듈의 결과 값의 위치가 'D:\python\workspace\travel' 에서 'D:\Python38\lib' 으로 변경된 것을 확인할 수 있다.
[Python 파이썬 독학 기본편] 졸업 (0) | 2020.10.12 |
---|---|
[Python 파이썬 독학 9-2일차] (0) | 2020.10.12 |
[Python 파이썬 독학 8일차] (0) | 2020.10.04 |
[Python 파이썬 독학 7-3일차] (0) | 2020.09.30 |
[Python 파이썬 독학 7-2일차] (0) | 2020.09.28 |
댓글 영역