모듈
변수, 클래스, 함수 등을 모아 놓은 스크립트 파일
모듈 사용하기
모듈 생성
- .py의 확장자를 갖는 파이썬 파일들이 모두 모듈이다.
- 그냥 파이썬 코드를 작성하고 저장하면 된다.
- 여기서는 예제로 사칙연산 함수를 작성하고 저장하겠다. (처음부터 같은 폴더에 저장하거나, 명령프롬포트로 실행하는 경우 cd 명령어를 이용해 해당 모듈이 있는 폴더로 이동해야 함.)
# Math.py 파일
def addNum(a, b):
return a + b
def subNum(a, b):
return a - b
def mulNum(a, b):
return a * b
def divNum(a, b):
if b == 0:
return False
else:
return a / b
모듈 불러오기
- import 명령어를 통해서 모듈을 불러와 사용할 수 있다.
- 방금 만들었던 Math.py을 불러와 사용하겠다.
같은 폴더에 있는 경우
# import 모듈명
import Math
- 단순히 import 명령어와 모듈 파일의 이름을 함께 작성하면 된다.
다른 폴더에 있는 경우
- cd 명령어를 통해 Math.py 모듈이 저장되어 있는 폴더까지 이동하고 import를 진행해야 한다.
- 위 방법 말고도 다른 폴더에 있는 경우에는 sys 모듈 또는 환경변수 설정을 통해 모듈을 불러오는 방법이 있다.
모듈 사용하기
- 모듈에 들어있는 함수를 사용하려면 "."(dot)을 입력하고 함수명을 뒤에 적으면 된다.
import Math
print(f"더한 값: {Math.addNum(10, 20)}")
print(f"뺀 값: {Math.subNum(10, 20)}")
print(f"곱한 값: {Math.mulNum(10, 20)}")
print(f"나눈 값: {Math.divNum(10, 20)}")
더한 값: 30
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
함수만 불러와서 사용하기
- "from 모듈명 import 함수명"으로 필요한 함수만 불러와서 사용할 수 있다.
- 이때는 모듈명을 적지 않아도 함수를 사용할 수 있다.
from Math import addNum
print(f"더한 값: {addNum(10, 20)}")
더한 값: 30
함수 전체 불러오기 (모듈명, 도트 사용 X)
- 혹은 *(Asterisk)를 이용하면 함수 전체를 불러오면서 사용할 때 모듈명을 적지 않을 수 있다.
from Math import *
print(f"더한 값: {addNum(10, 20)}")
print(f"뺀 값: {subNum(10, 20)}")
print(f"곱한 값: {mulNum(10, 20)}")
print(f"나눈 값: {divNum(10, 20)}")
더한 값: 30
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
if __name__ == "__main__":
- 가끔씩 모듈 파일을 열어보면 if __name__ == "__main__":이라는 문장이 있는 것을 볼 수 있다.
- 위 문장은 다른 파일에서 모듈을 불러올 때, 모듈에 있던 내용이 실행되지 않도록 하는 기능을 수행한다.
- 무슨 말인지 모를테니 예제를 보자.
예제
# Math.py 모듈
def addNum(a, b):
return a + b
def subNum(a, b):
return a - b
def mulNum(a, b):
return a * b
def divNum(a, b):
if b == 0:
return False
else:
return a / b
print(f"더한 값: {addNum(10, 20)}")
print(f"뺀 값: {subNum(10, 20)}")
print(f"곱한 값: {mulNum(10, 20)}")
print(f"나눈 값: {divNum(10, 20)}")
더한 값: 30
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
- 이전과 다르게 Math.py 모듈에 print를 실행하는 코드를 추가하였다.
- 위처럼 모듈 파일에서 만들어진 함수를 직접 실행하는 코드가 있을 수 있다.
- 이렇게 구현된 Math.py 모듈을 다른 파일에서 불러와 해당 모듈의 함수를 사용한다는 가정을 해보자.
다른 파일에서 Math 모듈 불러오기
import Math
print(f"더한 값: {Math.addNum(10, 20)}")
print(f"뺀 값: {Math.subNum(10, 20)}")
print(f"곱한 값: {Math.mulNum(10, 20)}")
print(f"나눈 값: {Math.divNum(10, 20)}")
더한 값: 30
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
더한 값: 30
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
- Math.py를 import 하면 Math.py에 있던 print 문이 그대로 실행되어 결과가 중복됨을 알 수 있다.
- 이러면 Math.py의 함수만 이용하려고 했던 의도가 망가져 버리게 된다.
- 이럴 때 아래처럼 Math 모듈에 if __name__ == "__main__": 문장을 이용하면 문제를 해결할 수 있다.
Math 모듈에 if __name__ == "__main__": 사용하기
# Math.py 모듈
def addNum(a, b):
return a + b
def subNum(a, b):
return a - b
def mulNum(a, b):
return a * b
def divNum(a, b):
if b == 0:
return False
else:
return a / b
if __name__ == "__main__":
print(f"더한 값: {addNum(10, 20)}")
print(f"뺀 값: {subNum(10, 20)}")
print(f"곱한 값: {mulNum(10, 20)}")
print(f"나눈 값: {divNum(10, 20)}")
더한 값: 30
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
- Math.py 모듈에 if __name__ == "__main__": 을 이용하더라도 아래의 코드들은 그대로 실행된다.
- 이제 다른 파일에서 Math.py 모듈을 불러와보자.
import Math
print(f"더한 값: {Math.addNum(10, 20)}")
print(f"뺀 값: {Math.subNum(10, 20)}")
print(f"곱한 값: {Math.mulNum(10, 20)}")
print(f"나눈 값: {Math.divNum(10, 20)}")
더한 값: 30
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
- if __name__ == "__main__": 을 사용한 결과, 이번에는 다른 파일에서 모듈을 불러와도 Math 모듈의 print 문이 실행되지 않았다.
- __name__ 은 파이썬 내부에서 사용되는 변수로, Math에서는 __name__에 "__main__"이 저장되지만, 다른 파일에서 불러오는 경우에는 __name__에 모듈명인 "Math"가 저장된다. 따라서 다른 파일에서는 if 문이 False가 되어 모듈의 print 문이 실행되지 않는 것이다.
클래스로 된 모듈
- 클래스로 구현된 모듈도 불러와서 사용하는 것이 가능하다.
Math 클래스
# Math.py 모듈
class Math:
def __init__(self, a, b):
self.a = a
self.b = b
def addNum(self):
return self.a / self.b
def subNum(self):
return self.a - self.b
def mulNum(self):
return self.a * self.b
def divNum(self):
if self.b == 0:
return False
else:
return self.a / self.b
- Math 모듈에 있던 함수들을 Math 클래스에 묶어 정리했다.
- 생성자를 구현하여 클래스를 불러올 때 변수를 초기화하도록 하였다.
다른 파일에서 Math 모듈의 Math 클래스 사용하기
import Math
inst = Math.Math(10, 20)
print(f"더한 값: {inst.addNum()}")
print(f"뺀 값: {inst.subNum()}")
print(f"곱한 값: {inst.mulNum()}")
print(f"나눈 값: {inst.divNum()}")
더한 값: 0.5
뺀 값: -10
곱한 값: 200
나눈 값: 0.5
- "모듈명.클래스명"으로 다른 파일에서 모듈의 클래스를 사용할 수 있다.