Point_Sec_0320

파이썬 클래스,모듈,패키지,내/외장함수 본문

python

파이썬 클래스,모듈,패키지,내/외장함수

Luck_Endeavor 2017. 4. 5. 16:11


파이썬 클래스,모듈,패키지,내/외장함수


* 클래스

- 사실 C언어에는 클래스가 없다. 클래스가 없어도 프로그램은 만들 수 있다.

- 이해하기 편하게 설명을 하자면 , 클래스는 달고나 뽑기의 틀과 같다.

별모양의 틀로 찍으면 별이 나오고 하트모양의 틀로 찍으면 하트가 나온다.

여기서 별과 하트는 인스턴스라고 보면 된다.

- 풀어서 설명하자면 클래스는 '설계도면'을 제시한다.


* 객체와 인스턴스의 차이

- 객체와 인스턴스의 의미에는 차이가 없다. 다만 인스턴스를 " 객체를 관계로 표현한 것 "을 나타낸다. 무슨말인고 하니 클래스 안에서 만들어진 객체를 인스턴스라고 한다. 

ex) Cat이라는 클래스에 choco = Cat()를 선언하면, choco는 Cat의 인스턴스라고 부른다.


* 클래스 만들기

- class Sample:

pass


* 클래스를 선언하기

- a = Sample()


* self에 대해 알아보기

- 클래스 안의 함수의 입력인수 첫번째에는 self를 입력

- 의미 : self는 클래스에 의해서 생성된 인스턴스를 지칭한다.

- 클래스를 선언한 변수를 굳이 입력인수에 넣을 필요는 없다. 자동으로 들어가기 때문


* __init__

- 인스턴스를 만들 때 항상 실행이 되어야 하는 함수( 다른 언어에서는 초기화함수라고 많이 지칭한다.)


* 클래스 구조

- 지금까지 봐왔던 변수를 선언하고 함수를 선언하고 연산, 제어문을 이용하고 이 모든 것을 클래스 안에 넣을 수 있다.

- class 클래스 이름[( 상속 클래스명 )] :


* 클래스 메소드 호출방법

- className.method(selfName,입력인수) - 클래스로 메소드를 불러올 때 self인수를 꼭 넣어준다.

- a= className() , a.method(입력인수) - 인스턴스로 메소드를 불러올 때 self인수를 꼭 빼준다.


 # 사칙연산 예제


* 클래스 상속

- 상속은 물려받다라는 의미

- 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받도록 기능하는 것


* 메소드 오버라이딩

- 상속받을 대상인 클래스의 메소드와 이름은 같은데 그 행동이 다른경우 사용

- 메소드의 이름은 같도록 만들지만 내용을 재정의한다.

( 오버로딩 = 같은 이름의 메소드를 입력인수를 다르게 하여 여러개 정의 하는것을 의미 )


* 연산자 오버로딩

- 연산자를 객체끼리 사용할 수 있도록 만든 기법

ex) class A:

def __add__(self, other): 

print ("")


a= A()

b= A()

a+b # 위의 def __add__가 (+) 표시로 사용



# 박씨네 집 예제

* 모듈

- 함수나 변수 또는 클래스들을 모아놓은 파일

- 모듈을 만들고 불러오기 : 파이썬 파일을 하나 만들고 저장한 다음 > 해당 파일이 있는 디렉토리에서 파이썬을 실행

> import 해당파일이름 그 후에 예제파일을 실행

- import 는 이미 만들어진 파이썬 모듈을 사용할 수 있게 해주는 명령어이다.

- (.)를 이용하여 사용하고 싶은 함수만 쓸수도 있다.

* 모듈함수를 사용하는 다른 방법

- from 모듈이름 import 함수이름1,함수이름2...


* if __name__ == "__main__": 의 의미

- 모듈파일에서 만약 실행문이 있는데 함수를 사용하기 위해 해당 모듈파일을 불러올 경우(import) 실행문이 실행하게 된다.  

- 즉 파이썬 파일을 그냥 실행시킬 때와 모듈파일로써 실행시킬 때를 다르게 사용하기 위해 존재하는 제어문이다.

- 직접 이 파일을 사용할 경우 __name__ == "__main__" 이 참이 되어 실행문이 실행되고 

- 모듈 파일로써 사용할 경우 __name__=="__main__"이 거짓이 되어 실행문은 실행되지 않는다.


* 모듈을 불러오는 또 다른 방법

- sys.path.append사용

import sys > sys.path 를 입력하면 sys 모듈을 이용해서 파이썬 라이브러리가 설치되어 잇는 디렉터리를 확인할 수 있다.

이 곳에 모듈파일을 모아놓은 디렉터리를 추가 시키면 아무데서나 편리하게 모듈파일을 불러낼 수 있다.

ex) >>>sys.path.append("C:\Python\Mymodules")입력

- PYTHONPATH 환경 변수 사용하기

cmd창을 활용하여 환경변수에 모듈이 담긴 디렉토리를 설정시키는 방법이다.

C:\Users\home> set PYTHONPATH=C:\Python\Mymodules

# 모듈 예제


* 패키지

- 도트(.)를 이용하여 "파이썬 모듈을 계층적으로 관리"할 수 있도로고 하는 것

- A.B라고 하면 A는 패키지, B는 모듈이 된다.

game/

__init__.py

sound/

__init__.py

echo.py

wav.py

graphic/

__init__.py

screen.py

render.py

play/

__init__.py

run.py

test.py


> 이런 구조로 만들어본다.

game 루트디렉토리 안에 __init__.py를 만들고 sound,graphic,play 서브디렉토리를 만들고 안에 __init.py와 나머지 모듈을 만든다.


* __init__.py의 용도

- 해당 디렉토리가 패키지의 일부임을 알려주는 역할

- __init__.py가 없다면 패키지로 인식하지 않는다.


* __all__의 용도

- from 디렉토리 import * >>오류가 뜬다.

- __init__.py에 __all__ = ['해당모듈']을 설정해줘야 한다.

- 이렇게 되면 import *이 해당모듈만 import한다는 의미가 된다.


* relative 패키지

- from game.sound.echo import echo_test 와 from ..sound.echo import echo_test가 같은 표현이다.

- (..)은 현재 디렉토리의 부모 디렉토리를 의미

- (..)과 같은 표현을 relative한 접근자라고 한다. ( 단, 모듈안에서만 가능, 인터프리터에서 접근자를 사용하면 error! )


## 패키지는 예제가 따로 없다.


* 예외 처리

- 오류를 만났을 때 의도적으로 오류를 무시하기 위한 것

- try,except을 이용


* 오류는 언제 만날까?

- 대표적으로 디렉토리안에 파일이 없는데 열려고 할때

0으로 다른 숫자를 나눌 때

리스트에 존재하지 않는 위치값을 얻으려 할 때


* 오류 예외 처리법

>> try:

...

except [발생오류 [as 오류 메시지 변수]]:

...

* except구문

- try,except만 쓰는 방법 > 오류 종류에 상관없이 except 블록을 수행

- 발생 오류만 포함한 except문 > 미리 정해 놓은 오류이름과 일치할 때 수행

- 발생오류와 오류메시지 변수까지 포함한 except문 > 위의 경우에서 오류메시지의 내용까지 알고 싶을 때


* try ..else

- except블로 뒤에 else: 블록을 붙여서 try시도 후에 오류가 발생하지 않으면 else블록으로 넘어간다.

* try ..finally

- finally같은 경우는 try블록이 실행도중 무슨 예외가 발생하던 상관없이 finally블록이 실행된다.


* 오류 회피시키기

- except블록 내용을 pass만 넣기

* 오류 일부로 발생시키기

- raise를 사용

- 상속 클래스에서 자식 클래스가 자신의 함수를 반드시 오버라이딩 시키고 싶을 때 raise문을 사용하여 오버라이딩을

하지 않으면 오류가 뜨도록 만든다.( 예제에서 확인하기 )

# 예외처리 예제


* 내장 함수

- 이미 만들어진 함수를 다시 정의하는 바보같은 짓은 할 필요가 없다.

- 파이썬 라이브러리를 둘러보는 것도 중요


* abs

- 숫자의 절대값을 리턴

* all

- 반복가능한 자료형을 입력받아 모두참인지 거짓인지 리턴

* any

- 반복가능한 자료형을 입력하다 하나라도 참이면 True, 모두 거짓일 때만 False로 리턴1

* chr

- 아스키코드 입력받아 해당 문자를 출력

* dir

- 객체가 자체적으로 가지고 있는 변수나 함수

* divmod

- a를 b로 눈 몫과 나머지를 튜플로 리턴

* enumerate

- 열거하다는 의미로, 자료형을 입력받아 인덱스값을 포함하는 객체를 리턴

* eval 

- 실행 가능한 문자열을 입력 받아 문자열을 실행한 결과값을 리턴 ( 입력받은 문자열로 함수나 클래스를 동적으로 실행)

* filter

- 걸러낸다는 의미, 필터요소를 첫번째 인수(함수)로 두번째는 리스트의 요소로 들어간다.

* hex

- 정수를 입력 , 16진수로 변환

* id

- 객체를 입력받아 객체의 고유 주소값을 리턴

* isinstance

- 첫번째 인수는 인스턴스, 두번째 인수는 클래스 이름을 입력 , 해당 객체가 클래스의 인스턴스가 맞는지 리턴

* lambda

- def와 같은 역할(예약어) , 보통 함수를 간결하게 한줄로 만들 때 사용

ex) sum = lambda a,b: a+b

lambda 인수1,인수2,,,, : 인수를 이용한 표현식

* map

- 함수와 반복가능한 자료형을 입력받아 그 자료형이 입력한 함수로 실행된 결과를 묶어서 리턴하는 함수

* oct

- 정수를 입력받아 8진수 문자열로 리턴

* ord

-  문자의 아스키코드값을 리턴

* pow 

- 첫번째 인수의 두번째 인수제곱한 결과 리턴

* sorted

- 입력값을 정렬하여 리스트로 리턴 ( 자료형의 sort함수는 리턴하지 않는다. )

* type

- 입력값의 자료형이 무엇인지 알려준다.

* zip

- 동일한 개수로 이러우진 자료형을 묶어주는 역할을 하는 함수


# 내장함수 예제


* 외장함수

- 전세계의 많은 파이썬 사용자들이 모아놓은 것이 파이썬 라이브러리다. 모든 라이브러리를 다 알 필요는 없고 어떤 라이브러리를 사용하면 되는지 정도만 알면 된다.


* sys

- 파이썬 인터프리터가 제공하는 변수들과 함수들을 직접 제어가능한 모듈

- import sys

sys.argv : 도스 창에서 모듈파일 뒤에 또 다른 값을 전달하는 기능 : 

- sys.exit :  강제로 스크립트 종료시키기 

sys.path : 자신이 만든 모듈 불러 사용하기 


* pickle

- 객체의 형태를 유지 동시에 파일에 저장하거나 불러올 수 있도록 하는 모듈

- import pickle 

- pickle.dump( 데이터를 담은 변수, 파일이름) : data를 그대로 파일에 저장시키기

- pickle.load(파일이름) : 파일에 있는 객체상태 그대로 불러온다.


*OS모듈

- 환경변수나 디렉터리, 파일등 OS자원을 제어

- import os

- os.environ : 현재시스템의 환경 변수값을 보여준다.

- os.chdir : 현재 디렉터리의 위치를 변경

- os.getcwd : 자신의 현재 디렉터리 위치를 리턴

- os.system : 시스템 자체의 프로그램이나 기타 명령어들을 파이썬에서 호출

- os.popen :  시스템 명령어를 실행시킨 결과값을 읽기 모드 형태의 파일객체로 리턴


* shutil

- 파일을 복사해주는 파이썬 모듈

- import shutil

- shutil.copy(src,dst) : src라는 파일을 dst로 복사, 만약 dst라는 파일이 존재했으면 덮어쓰기


* glob

- 특정 디렉터리에 있는 파일 이름을 모두 알아야 할 때 사용

- import glob

- glob.glob("C:\Python\q*") : 파이썬 디렉터리안에 q로 시작하는 모든 파일을 읽어들여라


* tempfile

- 파일을 임시로 만들어서 사용할 때 유용

- import tempfile

- tempfile.mktemp() : 중복되지 않는 임시 파일의 이름을 무작위로 만든다.

- tempfile.TemporaryFile() : 임시 저장 공간을 사용될 파일객체를 리턴( 기본적으로 바이너리 쓰기모드(wb))

파일.close()가 호출되면 객체는 사라짐


* time

- import time

- time.time :1970/1/1을 기준으로 지난시간을 초 단위로 리턴

- time.ctime : 현재 날짜, 시간을 리턴

- time.sleep : 주로 루프 안에서 많이 사용된다. 일정 시간간격을 두고 루프를 실행 !!!!!알아둘 것!!!!!


* random

- 난수를 발생시키는 모듈

- import random

- random.random() : 0.0~1.0사이의 수에서 실수 중에서 난수를 발생

- random.ranint(시작숫자,끝숫자) : 시작숫자부터 끝숫자까지 범위에서 정수형 난수를 발생

- random.choice(리스트) : 리스트에서 데이터를 랜덤하게 1개를 선택

- random.shuffle(리스트) : 리스트의 항목을 무작위로 섞고 싶을 때 사용


* webbrowser

- 기본 웹 브라우저가 자동으로 실행하도록 도와주는 모듈

- ex) import webbrowser

  webbrowser.open("http://google.com")

> 웹 브라우저가 실행된 상태면 해당주소로 이동, 실행중이지 않다면 새 웹브라우저를 실행


* threading (*)

- 프로세스 <- 컴퓨터에서 동작하고 있는 프로그램 , 1프로세스는 1가지 일만 실행.

- 스레드를 이용하면 1프로세스에서 동시에 여러가지 일을 동시에 실행

>> 다만 실제로 동시에 벌어지는 일은 아니다. 연산이 매우 빠르기 때문에 컴퓨터가 스케쥴링을 조절하여 동시에 일을 처리하는 것처럼 보이는 것

- 예제로  코드를 확인


# 외장함수 + 스레드 예제


##

이번 파트가 사실 파이썬의 가장 핵심적인 파트라고 보면 된다. 보면 막상 어렵진 않지만 모듈이나 패키지가 생소할 수 있다. 다만 내용을 정확히 알고는 있되 아직 생소한 느낌은 당연하다. 다음 게시글이 파이썬의 마지막 파트가 될 것이다. 간단한 예제들을 다뤄보고, xml, 정규표현식을 다뤄볼 예정이다. 

##


다른 고수님들의 피드백은 필자에게 매~우 감사한 일입니다. 댓글로 피드백, 질문 모두 받겠습니다. 감사합니다.

Comments