Python (3) - 클래스, 모듈, 패키지, 예외 처리

클래스

 

클래스(class)란 똑같은 무언가를 계속 만들어 낼 수 있는 설계 도면, 객체(object)란 클래스로 만든 피조물을 뜻합니다. 클래스로 만든 객체에는 바로 객체마다 고유한 성격을 가진다는 중요한 특징이 있습니다.

 

클래스는 다음과 같인 선언하고 생성합니다.

# 선언
class Cookie:
    pass
    
# 생성
a = Cookie()
pass는 아무것도 수행하지 않는 문법으로, 임시로 코드를 작성할 때 주로 사용합니다.

 

메서드와 인스턴스 변수

 

클래스에서 메서드는 다음과 같이 정의하고 사용합니다.

class FourCal:
    def setdata(self, firsh, second):
        self.first = first
        self.second = second
        
        
a = FourCal()
a.setdata(4, 2)

 

파이썬에서는 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용합니다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self라는 이름을 사용한 것입니다.

 

인스턴스 변수는 메서드 안에서 다음과 같이 선언할 수 있습니다.

# 클래스 내부
self.변수명 = 값

# 클래스 외부
a = FourCal()
a.변수명 = 값
파이썬은 자바와 달리 인스턴스 변수를 클래스 정의 시 미리 선언할 필요가 없습니다.

 

생성자

 

생성자(constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미하며 다음과 같이 선언할 수 있습니다.

class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second

 

__init__ 이라는 이름을 갖는 메서드를 생성하면 생성자로 인식됩니다.

 

상속

 

상속(Inheritance)이란 '물려받다'라는 뜻으로 다른 클래스의 기능을 물려받을 수 있게 만드는 것입니다.

다음과 같이 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 됩니다.

class MoreFourCal(FourCal):
    pass

 

메서드 오버라이딩

 

부모 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩이라 하며 다음과 같이 사용합니다.

class MoreFourCal(FourCal):
    def div(self):
        문장

 

클래스 변수

 

클래스 변수는 다음과 같이 선언할 수 있습니다.

클래스명.변수명 = 값

# example
FourCal.first = 1

 

클래스 변수를 변경하면 클래스로 만든 모든 객체의 값도 모두 변경됩니다.

 

 

모듈

 

모듈이란 함수나 변수 또는 클래스를 모아 놓은 파이썬 파일입니다. 또한 다른 파이썬 프로그램에서 불러와 사용할 수 있도록 만든 파이썬 파이라고도 할 수 있습니다.

import 모듈명

from 모듈명 import 모듈 함수

 

이때, 모듈 함수는 여러 개 나열이 가능하며 * 를 사용하여 모두 불러올 수 도 있습니다. (함수 외에도 클래스나 변수도 불러올 수 있습니다.)

 

__name__ 변수

 

__name__ 변수는 파이썬이 내부적으로 사용하는 특별한 변수 이름입니다. 해당 모듈을 import 하면 __name__ 변수에 모듈명(파일명)이 저장되고, 직접 실행할 경우에는 "__main__" 이 저장됩니다. 

 

파이썬은 import 시에도 모든 코드가 실행되는데 이를 방지하고자, 다음과 같이 __name__ 변수 값을 기준으로 직접 실행될 때만 코드가 실행되도록 할 수 있습니다.

if __name__ == "__main__":
    print(add(1, 2))
    print(add(2, 3))

 

 

 

패키지

 

파이썬에서 패키지(package)란 관련 있는 모듈의 집합을 의미합니다. 패키지는 파이썬 모듈을 계층적으로 관리할 수 있게 해줍니다.

 

__init__.py

 

각 폴더 하위에 __init__.py 파일이 존재하면 해당 폴더를 파이썬 패키지로 인식합니다. Python 3.3 부터는 해당 파일이 없어도 패키지로 인식되지만 하위 버전 호환을 위해 생성해주는 것이 안전합니다.

 

또한, __init__.py 파일은 패키지와 관련된 설정이나 초기화 코드를 포함할 수 있습니다.

 

1. 패키지 변수 및 함수 정의

패키지 수준에서 변수와 함수를 정의할 수 있습니다.

 

2. 패키지 내 모듈을 미리 import

패키지 내의 다른 모듈을 미리 import하여 패키지를 사용하는 코드에서 간편하게 접근할 수 있습니다.

다만, 모든 것(*)을 import 할 때는 __all__ 변수를 설정하여 import 할 수 있는 모듈을 정의해줘야 합니다.

__all__ = ['모듈명']

 

3. 패키지 초기화

패키지를 처음 불러올 때 실행되어야 하는 코드를 작성할 수 있습니다. 예를 들어 데이터베이스 연결이나 설정 파일 로드와 같은 작업을 수행할 수 있습니다.

 

relative 패키지

 

다음과 같이 현재 모듈의 위치를 기준으로 다른 모듈이나 패키지를 import할 수 있습니다.

from . import module_a          # 같은 디렉토리
from .module_a import func_a    # 같은 디렉토리의 함수


from .. import some_module      # 한 단계 위

 

 

예외 처리

 

다음은 오류를 처리하기 위한 try 문의 기본 구조입니다.

try:
    # 예외가 발생할 수 있는 코드
    ...
except [오류 [as 변수]]:
    # 예외 발생 시 처리
    ...
else:
    # 예외가 발생하지 않으면 이 부분 실행
    ...
finally:
    # 예외 발생 여부와 관계없이 항상 실행
    ...

 

오류 회피

 

아래와 같이 특정 오류가 발생할 경우 그냥 통과시킬 수 있습니다.

try:
    f = open("none", 'r')
except FileNotFoundError:	# 파일이 없더라도 오류가 발생하지 않고 통과
    pass

 

 

오류 발생

 

파이썬은 raise 명령어를 사용해 오류를 강제로 발생키길 수 있습니다.

calss Bird:
    def fly(self):
        raise NotImplementedError

 

예외 만들기

 

파이썬 내장 클래스인 Exception 클래스를 상속하여 커스텀 예외를 만들 수도 있습니다.

class MyError(Exception):
    def __str__(self):
        return "에러입니다."

 

위와 같이 __str__ 메서드를 구현하면 오류 메세지를 print() 함수로 출력할 수 있습니다.