#4 클래스 / 모듈 / 패키지

JIY00N·2023년 2월 1일
0

Python

목록 보기
4/9
post-thumbnail

2023.02.01

0. 시작하기전

이번 포스트에서는 파이썬의 클래스, 모듈, 패키지에 관해 공부해보자

1. 클래스

클래스와 객체를 비유로 이해해보자
✔ 클래스 - 과자 틀
✔ 객체 - 과자 틀을 사용해 만든 과자

✔ 객체와 인스턴스의 차이

a=Cookie() # a는 객체, a는 Cookie의 인스턴스

✔ 메서드 - 클래스 안에 구현된 함수

1-1 클래스 만들기

>>> 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

1-2 생성자(__init__)

✔ 생성자 - 객체가 생성될 때 자동으로 호출되는 메서드
✔ 객체에 초깃값을 설정할 필요가 있을때는 위의 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
        ...

1-3 상속

✔ 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받음
✔ 기존 클래스의 기능을 변경하거나 추가할 때 사용
class 클래스이름(상속할 클래스 이름)

>>> class MoreCal(TwoCal):
	def pow(self): 
    	return = self.first ** self.second # a의 b제곱
        return result
        
>>> a = MoreCal(4,2)
>>> a.pow()
16

✔ 메서드 오버라이딩 - 부모클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것
-> 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출됨

1-4 클래스 변수

✔ 클래스 안에 변수를 선언하여 생성
✔ 클래스로 만든 모든 객체에 공유됨

>>> class Family:
		lastname="kim" # lastname:클래스 변수
>>> print(Family.lastname)
kim

2. 모듈

✔ 함수나 변수 또는 클래스를 모아 놓은 파일

2-1 모듈 만들기

# mod1.py  
# mod1.py 파일: 모듈
>>> def add(a,b):
		return a+b
>>> def sub(a,b)
		return a-b

2-2 모듈 불러오기

  1. import 모듈이름
>>> import mod1
>>> print(mod1.add(3,4))
7
>>> print(mod1.sub(4,2))
2
  1. from 모듈이름 import 모듈 함수
# add 함수 한 개 사용
>>> from mod1 import add 
>>> add(3,4)
7

# mod1에 들어있는 함수 여러개 사용
>>> from mod1 import add, sub

# mod1에 들어있는 함수 모두 사용
>>> from mod1 import *
  1. 다른 파일에서 모듈 불러오기

✔ 모듈이 있는 디렉터리로 이동 후 사용

# 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__"이라는 조건문을 넣고, 조건문 안에는 직접 실행시켰을 때 실행되길 원하는 코드들을 넣음

2-3 클래스나 변수등을 포함한 모듈

# 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

3. 패키지

✔ 패키지는 도트를 사용하여 파이썬 모듈을 계층적으로 관리할 수 있게 함

# 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 - 해당 디렉터리가 패키지의 일부임을 알려주는 역할

3-1 패키지 만들기

# 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

3-2 패키지안의 함수 실행

# 첫번째 방법 - 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

3-3 relative 패키지

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
  1. relative하게 접근(..) 연산자 사용 - 모듈안에서만 사용
# render.py
>>> from ..sound.echo import echo_test # .. 부모 디렉터리를 의미
def render_test():
	print("render")
    echo_test()

4. To be continued..

다음 포스트에서는 파이썬의 예외 처리, 자주 쓰이는 내장 함수, 라이브러리에 관해 공부하자 !

이전 포스트 Python-3 https://velog.io/@jiyoon2/Python-3
다음 포스트 Python-5 https://velog.io/@jiyoon2/Python-5

profile
블로그 이전 했습니다. https://yoon-log.vercel.app/

0개의 댓글