이번 포스트에서는 파이썬의 클래스, 모듈, 패키지에 관해 공부해보자
클래스와 객체를 비유로 이해해보자
✔ 클래스 - 과자 틀
✔ 객체 - 과자 틀을 사용해 만든 과자
✔ 객체와 인스턴스의 차이
a=Cookie() # a는 객체, a는 Cookie의 인스턴스
✔ 메서드 - 클래스 안에 구현된 함수
>>> class TwoCal: # 클래스 생성
def setdata(self, first, second):
''' 첫번째 매개변수는 관례적으로 self사용
setdata 메서드를 호출한 객체 a가 자동으로 self에 전달'''
self.first = first
self.second = second
def add(self): #덧셈 기능 add 메서드
result = self.first + self.second
return result
def sub(self): #뺄셈 기능 sub 메서드
result = self.first - self.second
return result
>>> a = TwoCal() # a객체 생성
>>> a.setdata(4,2) # self=a, first=4, second=2 대입
>>> print(a.first)
4
>> print(a.second)
2
>>> a.add()
6
>>> a.sub()
2
✔ 생성자 - 객체가 생성될 때 자동으로 호출되는 메서드
✔ 객체에 초깃값을 설정할 필요가 있을때는 위의 setdata 메서드 호출 보다는 생성자를 구현
>>> class TwoCal:
def __init__(self, first, second): # 생성자 setdata와 동일
self.first = first
self.second = second
def setdata(self, first, second):
self.first = first
self.second = second
...
✔ 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받음
✔ 기존 클래스의 기능을 변경하거나 추가할 때 사용
✔ class 클래스이름(상속할 클래스 이름)
>>> class MoreCal(TwoCal):
def pow(self):
return = self.first ** self.second # a의 b제곱
return result
>>> a = MoreCal(4,2)
>>> a.pow()
16
✔ 메서드 오버라이딩 - 부모클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것
-> 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출됨
✔ 클래스 안에 변수를 선언하여 생성
✔ 클래스로 만든 모든 객체에 공유됨
>>> class Family:
lastname="kim" # lastname:클래스 변수
>>> print(Family.lastname)
kim
✔ 함수나 변수 또는 클래스를 모아 놓은 파일
# mod1.py
# mod1.py 파일: 모듈
>>> def add(a,b):
return a+b
>>> def sub(a,b)
return a-b
>>> import mod1
>>> print(mod1.add(3,4))
7
>>> print(mod1.sub(4,2))
2
# add 함수 한 개 사용
>>> from mod1 import add
>>> add(3,4)
7
# mod1에 들어있는 함수 여러개 사용
>>> from mod1 import add, sub
# mod1에 들어있는 함수 모두 사용
>>> from mod1 import *
✔ 모듈이 있는 디렉터리로 이동 후 사용
# modtest.py # modtest.py와 mod1.py가 동일한 디렉터리에 있어야 함
import mod1
result = mod1.add(3,4)
print(result)
✔ sys.path.append(모듈을 저장한 디렉터리) 사용
>>> import sys
>>> sys.path # 파이썬 라이브러리가 설치되어 있는 디렉터리 보여줌
['','C:\\Windows\\SYSTEM32\\python37.zip',...]
>>> sys.path.append("C:/doit/mymod") # 추가하려는 디렉터리 sys.path에 추가
>>> sys.path
['','C:\\Windows\\SYSTEM32\\python37.zip',...,'C:/doit/mymod']
>>> import mod1
>>> print(mod1.add(3,4))
7
✔ PYTHONPATH 환경 변수 사용
'''set명령어를 사용해 PYTHONPATH 환경변수에
mod1.py파일이 있는 C:\doit\mymod 디렉터리 설정'''
C:\doit>setPYTHONPATH=C:\doit\mymod
C:\doit>python
>>> import mod1
>>> print(mod1.add(3,4))
7
🎯 if __name__=="__main__" 의 의미
✔ __name__
- 현재 모듈의 이름을 담고있는 내장 변수
- 이 변수는 직접 실행된 모듈의 경우 __main__이라는 값을 가지고,
직접 실행되지 않은 import된 모듈은 모듈의 이름(파일명)을 가짐
✔ 모듈에 if __name__=="__main__"이라는 조건문을 넣고, 조건문 안에는 직접 실행시켰을 때 실행되길 원하는 코드들을 넣음
# mod2.py
PI = 3.14 # 변수
class Math: # 클래스
def solv(self,r):
return PI * (r**2)
def add(a,b) # 함수
return a+b
>>> import mod2
>>> print(mod2.PI) # PI변수 사용
3.14
>>> a = mod2.Math() # Math클래스 사용
>>> print(a.solv(2))
12.56
>>> print(mod2.add(mod2.PI,4.4) # add함수 사용
7.54
✔ 패키지는 도트를 사용하여 파이썬 모듈을 계층적으로 관리할 수 있게 함
# game=root directory, sound,graphic,play=sub directory
# .py=module
game/
__init__.py
sound/
__init__.py
echo.py
wav.py
graphic/
__init__.py
screen.py
render.py
play/
__init__.py
run.py
test.py
✔ __init__.py - 해당 디렉터리가 패키지의 일부임을 알려주는 역할
# C:/doit 디렉터리 밑에 서브디렉터리를 생성하고 .py파일을 만든다
# echo.py
def echo_test():
print("echo")
# render.py
def render_test():
print("render")
# game 패키지를 참조 하도록 set명령어로 PYTHONPATH환경변수에 C:/doit 디렉터리 추가
C:\>setPYTHONPATH=C:\doit
C:\>python
# 첫번째 방법 - echo 모듈을 import
>>> import game.sound.echo
>>> game.sound.echo.echo_test()
echo
# 두번째 방법 - echo 모듈이 있는 디렉터리까지 from..import
>>> from game.sound import echo
>>> echo.echo_test()
echo
# 세번째 방법 - echo 모듈의 echo_test함수를 직접 import
>>> from game.sound.echo import echo_test
>>> echo_test
echo
graphic 디렉터리의 render.py모듈이 sound 디렉터리의 echo.py 모듈을 사용하고 싶을때의 방법이다.
1. render.py 수정
# render.py
from game.sound.echo import echo_test # 문장 추가
def render_test():
print("render")
echo_test()
# 실행
>>> from game.graphic.render import render_test
>>> render_test()
render
echo
# render.py
>>> from ..sound.echo import echo_test # .. 부모 디렉터리를 의미
def render_test():
print("render")
echo_test()
다음 포스트에서는 파이썬의 예외 처리, 자주 쓰이는 내장 함수, 라이브러리에 관해 공부하자 !
이전 포스트 Python-3 https://velog.io/@jiyoon2/Python-3
다음 포스트 Python-5 https://velog.io/@jiyoon2/Python-5