상세 컨텐츠

본문 제목

[PLAYDATA] 데이터 엔지니어링 8월 3주차 8/18

PLAYDATA/PLAYDATA데일리노트

by Na느님 2023. 8. 18. 11:26

본문

  • 8월 18일
수업은 어제 배웠던 클래스 개념을 쭉 이어서 설명하고 있었다. 나는 기존에 이미 C++을 사용해 왔기 때문에 클래스 개념을 잘 받아들일 수 있었지만, 처음 접하는 사람에게는 많이 어려운지 수업시간을 클래스 개념에 상당한 부분을 부여하고 있었다. 그래도 다들 열심히 배우려는 것 같다.

 

 

정적 메서드
정적 메서드란, 클래스의 멤버 함수들을 객체 생성 없이 호출하고 싶을 때 사용한다.
어떤 메서드들을 특정 클래스라는 카테고리로 묶고 싶을 때 사용할 수 있다.

사용법:
멤버함수에 @staticmethod 데코레이터를 붙인다. 정적메서드는 self 라는 argument가 없음에 유의.
정적 메서드 호출은 class_name.func(args, ...) 형태로 점(.) 앞에 클래스 이름이 온다.


클래스 메서드
클래스 메서드는 정적 메서드처럼 객체 없이 호출할 수 있다. 다만 다른점은 클래스의 멤버변수에 접근해야 할 때 사용한다.
(중요!)클래스 메서드는 맨 앞의 parameter에 cls가 들어간다! 멤버함수가 기본적으로 맨 앞에 self를 넣는 것과 동일한 원리.
클래스 메서드 안에서 cls() 호출 등으로 내부에서 인스턴스를 생성할 수 있다.

사용법:
멤버함수에 @classmethod 데코레이터를 붙인다. 클래스 메서드는 cls 라는 argument가 맨 앞에 있어야 한다.
ex)
@classmethod
def create(cls):
    p = cls()    # cls()로 인스턴스 생성
    return p
(예시에 나오는 클래스 메서드는 당연히 어떤 클래스 내부에 있는 멤버함수이다)


클래스 멤버 은닉
멤버변수, 멤버함수 이름 앞에 underbar(_) 두 개를 붙이면 이 멤버는 외부에서 접근이 불가능하다.


예외 처리
보통 Error 요소가 발생하면 ~~~Error가 뜨면서 프로그램이 종료된다.
그런데 이런 error 요소가 발생함에도 불구하고, 프로그램 종료를 원치 않을경우 예외처리 기법을 통해 예외를 handling하고 프로그램을 재개하는 것이 가능하다.

실행 흐름:
try 구문 안에서 예외 발생시, 바로 except 구문으로 넘어간다.
예외가 발생되지 않았다면 except구문은 실행되지 않는다.

예외처리 형태:
try:
    #codes that exception handling is considered
except (exception_name):
    #codes of error handler
(exception_name은 생략시 모든 exception을 받는다. exception_name을 지정하여 특정 exception만 받도록 설정할 수 있다.)
(except 구문은 여러개 작성이 가능하다. 즉 error type별로 handler 코드를 다르게 지정하는 것이 가능)

else와 finally
else문은 except와 반대로 예외가 발생하지 않았다면 실행될 코드 부분이다. 반드시 하나 이상의 except 구문이 있어야 하며 except구문 바로 밑에 작성해야 함.
finally문은 예외 발생 여부와 상관없이 무조건 실행되는 부분이다.
요약)
try: 예외 발생시 예외 처리를 원하는 코드의 목록
except: 예외 발생시 실행
else: 예외 발생 없으면 실행
finally: 예외 여부 무관하게 무조건 실행

일반적인 형태:
try:
    #codes that exception handling is considered
except (exception_name1):
    #codes of error handler
except (exception_name2):
    #codes of error handler
...
except:
    #codes of error handler
else:
    #codes when error is not occured
finally:
    #codes to be executed regardless of exception occurence

 

 

모듈
기존에 만들어진 소스코드를 모듈이라고 한다. 즉 파이썬에서 모듈은 하나의 파이썬 파일이다.
다른 소스코드가 모듈을 불러와서 자신의 코드에 포함시킬 수 있다.

모듈 불러오기
import file_name

파일이름만 쓴 경우, 현재 디렉터리(pwd)에서만 찾는다. (not recursive)

모듈 중에서 특정 변수나 함수만 불러오기
from module_name import member1, member2, ...
from module_name import * (모든 요소들을 불러오기)

모듈에 있는 함수 사용법
함수 이름 앞에 모듈이름. 을 붙인다.
module_name.func_name(args, ...)
from ~ import ~ 형식으로 불러온 경우에는 모듈이름을 붙이지 않는다.

Tip) 매직 명령어
ipython과 jupyter를 사용한다면 매직명령어 기능을 사용하여 더 편리한 코딩이 가능하다.
매직명령어는 line매직 명령어와 cell매직 명령어로 나뉜다.
line은 한 라인만 매직명령어로 간주하고 cell은 여러 줄을 매직명령어로 간주한다.

매직 명령어 형식:
line매직명령어
%command content

cell매직명령어
%%command content
content
...

대표적으로 %%writefile이 있다.

모듈 이름 임의 지정
뒤에 as name 을 붙이면 된다.
예를들면 from ~ import ~ as name

모듈 삭제
del module_name

 

if __name__ == '__main__' 구문
if __name__ == '__main__' 구문은 해당 파이썬 파일이 모듈에 의해 불려져 왔는지, 아니면 콘솔 등에 의해 직접 실행 되는지를 구분해 주는 조건문이다.
__name__은 파이썬 자체의 built-in 변수로, 모듈에 의해 불려진 파일이면 __name__값은 모듈 이름을 갖는 string이다.


패키지
패키지란 모듈들을 디렉터리를 이용하여 계층적으로 정리한 모듈의 집합이다.
import할 때 디렉터리, 모듈 둘 다 import문에 이름만 적는다. 하위 디렉터리, 파일을 가리킬 땐 도트(.)를 이용한다.
ex)
import aa.bb.cc
(C:\Users\Playdata\test_pack\aa\bb\cc.py 처럼 도트는 디렉터리 계층을 가리킨다)

__init__.py
__init__.py 파일이 어떤 디렉터리에 있으면 해당 디렉터리는 파이썬의 패키지라는 의미를 갖는다. 따라서 이 파일은 파이썬의 패키지를 가리키는 파일이다.
해당 패키지를 import했을 때, 바로 실행되어야 하는 코드들이 들어갈 수 있다.

 

패키지 제작 방법

예를 들어, 디렉터리 구조가 다음과 같다고 하자.

더보기

test_package
-> __init__.py
-> pack1
->-> __init__.py
->-> pack01.py
-> pack2
->-> __init__.py
->-> pack02.py

프로그래머가 실행하려는 파이썬 파일과 동일한 디렉터리 또는 환경변수에 의한 기본 경로에 있는 package이름(패키지의 최상위 디렉터리)을 호출한다.

import test_package as tp

이때 패키지 안의 모든 모듈들이 사용 가능하게 하려면 test_package디렉터리의 __init__.py는 다음과 같은 내용이다.

from .pack1.pack01 import *
from .pack2.pack02 import *

쉽게 말해, 패키지 최상위 디렉터리를 import하면, 최상위 __init__.py가 자동으로 실행되어 패키지 내의 모든 모듈들이 import되는 원리이다.


Tip)
import문 같이 파일 또는 디렉터리를 가리킬 때, 맨 앞에 도트(.)를 적으면 그것은 현재 디렉터리를 의미한다.
ex) .aa.bb.cc
-> 현재 디렉터리에서 aa와 bb디렉터리를 지나 cc파일(또는 subdirectory)을 가리킨다는 뜻

관련글 더보기