파이썬 기본 문법 익히기_4
파이썬 프로그래밍 핵심! 클래스
-
- class 가 필요한 이유?
- 어떠한 기능 사용(함수) + 값 저장(전역 변수) 를 하기 위해서!
- class 로 기능을 여러번 사용할 수 있다(인스턴스 생성으로!)
- 클래스 개념 잡기
- Ex) 클래스 [쿠키틀] - 인스턴스 [쿠키]
- 클래스는 인스턴스를 만들기 위한 설계도 이다
- 객체 - 클래스 (용어정리) ex) navi = cat()
- navi 는 객체
- navi는 cat의 인스턴스 이다
- 즉 인스턴스는 관계위주 설명일 때 사용
- 객체 - 클래스 (용어정리) ex) navi = cat()
- 클래스 기초
- self 맴버변수
- this와 유사하며 해당 클래스에서 생성된 인스턴스를 지칭!
- 클래스 내부 함수 선언시 첫 매개변수는 self!클래스
- self 맴버변수
- class 가 필요한 이유?
Ex) self
class Service:
def setname(self, name):
self.name = name
print(name)
>>>pey.Service()
>>>pey.setname('ABC') // pey의 pey.name 은 'ABC' 이다
ABC
- __init__ 함수
- instance를 만들 때 상상 실행된다 ( 생성자와 비슷함 )
- __init__ 함수
Ex) __init__
class Service:
def __init__(self, name):
self.name = name
print name
>>>pey = Service("ABC") // 아까 예시의 setname이 같이 실행된것 처럼 보임
ABC
- 클래스 자세히 알기
- 클래스의 구조
- 클래스 자세히 알기
class [클래스명] [(상속 클래스 명)]:
<클래스 변수1>
<클래스 변수2>
def [클래스 함수1] (self, [인수 ~ ])
<문장1>
~ 형태
- 클래스의 상속
- 상속이란 ? 다른 클래스의 기능을 물려받는 것
- [ class 상속받을 클래스명 (상속할 class명) ]
ex)
class A:
def sum(self, a, b)
print(a+b)
class B(A):
>>> x = B()
>>> x.sum(2, 5)
7
- 메서드 오버라이딩
- 상속받는 class에서 상속할 class와 같은 이름의 메서드를 만들어 재 정의하는 것
- 이때 재정의한 기능으로 사용된다
ex)
class A:
def cal(self, a, b)
print(a+b)
class B(A):
def cal(self, a, b) // 메서드 오버라이딩
print(a-b)
>>> x = B()
>>> x.cal(5, 2)
3
- 연산자 오버로딩
- 연산자(+, -, /, *등) 을 객체끼리 사용할 수 있게 함
ex)
class HousePark:
last name = '박'
def __init__ (self, name):
self.fullname = self.lastname + name
def __add__ (self, other):
print(%s 과 %s %(self.fullname, other.fullname)
>>> A = HousePark("땡땡")
>>> B = HousePark("아무개")
>>> A+B // A=self, B=other
박땡땡 과 아무개
- | + | / | * |
__sub__ | __add__ | __trudiv__ | __mul__ |
2. 모듈
= 함수나 변수, 클래스들을 모아놓은 파일,
= 다른 파이썬 프로그램에서 불러와 사용할 수 있게 만듬
-1 모듈 만들고 불러오기
만들기 (mod1모듈)
#mod1.py
def sum(a, b):
return a+b
불러오기(동일 dir 에서)
>>>import mod1 // 불러온 상태
>>>print(mod1.sum(5, 6)) // 불러와서 기능 사용
11
>>>from mod1 import sum // sum 함수 바로 사용하게 불러오기
>>> print(sum(5, 6)
11
-2 if__name__ == "__main__": 의 의미
mod1.py 에 if__name__ == "__main__": print(sum(1, 2)) 추가
--- mod1.py 실행시
3 출력 -> 메인이기 때문에 if문 참
--- 다른 곳에서 mod1모듈 호출시
출력 X
메인이 아니기 때문에 if문이 거짓 (아래내용 실행 X)
3. 패키지
= 도트(.)를 이용하여 파이썬 모듈을 계층적(dir구조) 로 관리함
= 공통 작업에서 유리, 유지보수 유리, 모듈 이름이 같아도 경로가 달라 사용 가능!
Ex) game 패키지
Ex) game 패키지 game/ __init__.py sound/ __init__.py echo.py wav.py graphic/ __init__.py render.py play/ __init__.py |
#echo.py def echo_test(): print("echo") |
#render.py def render_test(): print("render") |
-> game, sound, graphic, play는 디렉터리, game이 루트 dir, 나머지 sub dir
- 사용법
>>> import game.sound.echo
>>> game.sound.echo.echo_test()
echo
>> from game.sound import echo
>> echo.echo_test()
echo
-> import만 사용하면 경로를 전체 적어서 모듈 안에 함수 사용
-> from a import b 로 하면 경로를 a까지는 생략 가능, a부터는 적어야 함
-> from 이 없을 때 import의 마지막 항목은 반드시 모듈이나 패키지 여야 한다!
- __init__.py의 용도
= 해당 dir이 패키지의 일부임을 알려주는 역활
ex) sound/ 에 __init__.py가 없으면
game/
grapic/ play/
-----------------------> 사실 python3.3부터는 없어도 인식한다,,, 하지만 하위버전 호환을 위해 사용하자!
- __all__의 용도(__init__.py파일 안에 변수)
= 특정 dir* 로 모듈을 사용할 때 __all__로 설정된 모듈은 모듈.함수 로 사용할 수 있다
ex)(sound에는 echo.py, wav.py가 존재)
#__init__.py
__all__ = ['echo']
>>> from game.sound import *
>>> echo.echo_test()
echo
>>> wav.wav_test()
오류 발생! // __all__ 변수에 선언 안되있기 때문
- relative 패키지
ex) graphic의 render.py에서 echo.py를 사용하려면
#render.py from game.sound.echo import echo_test def render_test(): print('render') echo_test() |
#render.py from ..sound.echo import echo_test def render_test(): print('render') echo_test() |
이때 sound의 부모 dir, graphic의 부모 dir은 game으로 동일하다 (깊이depth 가 같다)
..의 뜻은 자신의 부모 dir경로를 나타내므로
graphic에서의 .. = game = sound에서의 .. 이다
따라서 from game.sound.echo import echo_test = from ..sound.echo import echo_test
-> 이때 .. 은 모듈 내에서만 사용 가능한 경로이다
4. 예외처리
= 프로그램 작성중 발생하는 오류를 예외적으로 처리할 수 있다
- 오류 발생 상황
1. 디렉터리에 없는 파일을 열려고 할 때 : FileNotFoundError
>>> f = open('없는파일', r)
2. 0으로 다른 숫자를 나눌 때 : ZeroDivisionError
>>> 4/0
3. 리스트 인덱스 오류 : IndexError
- 오류 예외처리 기법
1. try except 문
실행문1 실행중 오류가 발생하면 실행문2 실행
try: <실행문1> except [발생오류[as 오류메시지 변수]]: <실행문2> |
try: 4/0 except ZeroDivisonError as e: print(e) ------------------------ division by zero |
2. try else 문
예외가 발생하지 않은 경우 실행, 반드시 except 절 바로 다음에 위치해야 함
오류발생 = 2 실행, 정상 실행 = 1, 3 실행
try:
<실행문1>
except [발생오류[as 오류메시지 변수]]:
<실행문2>
esle:
<실행문3>
3. try finally 문
예외가 발생하던 말던 수행해야 하는 것(대부분 리소스.close() 인 경우에 많이 쓰임)
- 오류 회피하기
파일이 없는 경우 pass로 실행 안하고 지나감
try:
f = open('없는파일', r)
except FileNotFoundError:
pass
- 오류 일부러 발생시키기
raise 내장오류 로 발생시킴
5. 내장함수
숫자 관련 | 리스트, 튜플, 문자열, 딕셔너리, 집합 등 반복 가능한 것들 | 기타 |
abs(x) = x의 절댓값 반환 | all(x) = x가 모두 참이면 True, 하나라도 거짓이면 False | input(x) = 사용자가 입력을 받는 함수, x(문자열) 을 프롬프트에 띄움 |
divmod(a, b) = a를 b로 나눈 몫과 나머지를 튜플의 형태로 반환 | any(x) = x가 모두 거짓이면 False, 하나라도 참이면 True | lamda 인수 표현식 = 함수를 생성할 때 한줄로 선언 def와 동일한 역할을 함 |
hex(x) = x를 16진수로 변환하여 반환 | range([strat,] stop [, step]) = 범위의 값을 반복가능한 객체로 반환, start가 없으면 0부터, step은 숫자 사이의 거리 | open(filename, [mode]) = 파일을 모드 형태로 파일 객체를 반환함 |
int(x) = x(문자열형태 숫자, 소수점)을 정수 형태로 반환 | dir | str(object) = object를 문자열 형태로 변환하여 반환 |
int(x, radix) = radix형태로 표현된 x를 10진수로 반환 | enumerate(~) = 순서가 있는 자료형을 인덱스 값을 포함하는 것으로 반환한다 for문에서 많이 쓰임 (0, a), (1, b) 형태로 반환 | type(object) = 입력값의 자료형을 알려줌 |
oct(x) = 정수의 형태를 8진수로 반환 | eval(x) = 문자열을 실행한 결과 값을 리턴하는 함수 ? | instance(object, class) = object가 class의 인스턴스인지 비교(T or F)로 반환 |
chr(i) = 아스키 코드값i에 해당하는 문자 출력 | filter(a, 반복가능 자료형) = 반복 가능 자료 형 중 a를 만족하는 것만 반환 a = 함수(조건) |
id(x) = 객체를 입력받아 객체의 주소값(reference)를 반환 |
ord(c) = 문자의 아스키 코드값을 반환 | len(s) = s의 길이를 반환 | |
pow(x, y) = x의 y제곱 반환 | list(s) = 반복 가능한 자료형 s를 입력받아 리스트로 반환 | |
map(f, x) = 함수(f)와 반복가능 자료형(x) 로 입력받은 자료형의 각 요소가 f에 의해 수행된 결과를 묶어서 반환한다 | ||
max(x) = 반복가능한 자료형x중 최대값을 반환 / min(x) = 최소값 반환 | ||
sorted(x) = 반복가능한 자료형 x 를 정렬해서 반환(list의 .sort는 반환 X ) | ||
tuple(x) = 반복 가능한 자료형 x 를 튜플로 반환 | ||
zip(iterable*) = 동일한 개수로 이뤄진 자료형을 묶어줌 |
6. 외장함수
= 파이썬 라이브러리 사용
- sys = sys 모듈은 파이썬 인터프리터가 제공한 변수 함수를 직접 제어할 수 있게 해줌
- pickle = 객체의 형태를 유지하면서 파일에 저장
- OS = 환경변수 dir, file등 os자원 제어 가능하게함
- shutil = 파일 복사 모듈
- glob = dir의 파일이름 읽기
- tempfile = 임시 파일 생성후 사용
- time = 시간관련
- calendar = 달력을 보여줌
- random = 난수 생성
- webbrowser = 기본 웹프라우저 자동 실행됨
=========================================================================
연습문제
#calculator.py
class Calculator :
def __init__ (self, list) :
self.list = list
def sum(self) :
tmp = 0
for x in self.list :
tmp += x
return tmp
def avg(self) :
tmp = 0
for x in self.list :
tmp += x
return tmp/len(self.list)
if __name__ == '__main__' :
cal1 = Calculator([1, 2, 3, 4, 5])
cal2 = Calculator([6, 7, 8, 9, 10])
print(cal1.sum())
print(cal1.avg())
print(cal2.sum())
print(cal2.avg())