[ZB] 파이썬 중급 4

SeriesWorld·2023년 10월 27일

ZB20

목록 보기
8/9
post-thumbnail

상속

다중 상속

  • class [클래스명]([부모클래스1], [부모클래스2]) 형식으로 여러 개의 클래스로부터 상속받을 수 있다.
  • 부모클래스의 메서드명이 동일한 경우 먼저 상속받는 클래스의 메서드가 호출되지만, 헷갈릴 수 있으므로 주의가 필요하다.

    super()로 상위 클래스를 불러올 때 먼저 상속받는(앞에 써있는) 클래스가 지정된다.

오버라이딩

  • 부모 클래스의 기능(메써드)를 재정의할 수 있다.

추상클래스

  • 상위 클래스에서 메서드를 빈 상태로 두고, 하위 클래스에서 구현하도록 강요한다.(구현하지 않으면 에러)
  • abc 패키지에서 ABCMeta class 호출, abstractmethod 호출

    abc : abstract base class
    @abstractmethod: 추상 메서드 지정

from abc import ABCMeta
from abc import abstractmethod

class AirPlane(metaclass=ABCMeta):
    @abstractmethod    # 빈 메서드,정의되지 않은 객체 생성시 오류 발생
    def flight(self):
        pass

    def forward(self):
        print('전진')


class AirLiner(AirPlane):
    def __init__(self, c):
        self.color = c

    def flight(self):
        print('시속 400km/h 비행')

al = AirLiner('red')
al.flight()   # 시속 400km/h 비행
al.forward()   # 전진

예외처리

  • try ~ except으로 감싼다.
eveList = []; oddList = []; floatList = []; dataLise = []

n = 1
count = 0
while n < 6:
    try:
        data = input('input number: ')
        num = float(data)

    except:
        print('오류 발생')
        continue   # 오류 발생시 아래 else문을 실행하지 않고 위로(try문) 올라가 다시 실행

    else:
        if num - int(num) != 0: 
            floatList.append(num)

        elif num % 2 == 0:
            eveList.append(int(num))

        else:
            oddList.append(int(num))
        
        n += 1
        dataList.append(data)

    finally:
    	count += 1
    	
        	
print(f'eveList: {eveList}')
print(f'oddList: {oddList}')
print(f'floatList: {floatList}')    
print(f'dataList: {dataList}')
print(f'입력시도: {count}')
  • ~ else 뒤에는 try에서 통과됐을 때 이후 실행된다. (try~except 뒤에 사용)

  • finally 뒤에는 항상 실행된다!(try에서 오류가 발생해도, else문이 실행된 이후에도)

예외 관련 클래스는 Exception 클래스를 상속한다.

  • 0으로 나눴을 때(ZeroDivisionError), 리스트 등에서 인덱스를 잘못 입력했을 때(IndexError) 등등

Exception 클래스

  • 예외를 담당하는 클래스로, 어떤 예외가 발생했는지 알 수 있다.
try:
	print(f'{num1} / {num2} = {num1 / num2}')
except Exception as e:
	print(f'Exception: {e}')   # 0으로 나눌 시 'Exception: division by zero' 출력
  • try문 실패시 Exception 클래스 객체를 생성한다.

  • raise 키워드를 통해 예외를 발생시킬 수도 있다.
def divCal(n1, n2):
    if n2 != 0:
        print(f'{n1} / {n2} = {n1 / n2}')
    else:
        raise Exception('0으로 나눌 수 없습니다.')

num1 = int(input('num1: '))
num2 = int(input('num2: '))

try:
	divCal(num1,num2)
except Exception as e:
    print(f'Exception: {e}')   # 0으로 나눌 시 'Exception: 0으로 나눌 수 없습니다.' 출력
  • Exception('오류내용', *) * 위치에 숫자를 표시하여 Exception 내용을 구분할 수 있다.
def sendSMS(msg):
    if len(msg) > 10:
        raise Exception('길이 초과! MMS 전환 후 발송!!', 1)

    else:
        print('SMS 발송!!')


def sendMMS(msg):
    if len(msg) <= 10:
        raise Exception('길이 미달! SMS 전환 후 발송!!', 2)

    else:
        print('MMS 발송!!')


msg = input('input message: ')

try:
    sendSMS(msg)
except Exception as e:
    print(f'e: {e.args[0]}')   # 오류 내용 출력

    if e.args[1] == 1:   # 오류 구분에 따라 다른 함수 실행
        sendMMS(msg)
    elif e.args[1] == 2:
        sendSMS(msg)

사용자 예외 클래스

  • Exception 클래스를 상속받아 사용자가 직접 예외 클래스를 만들 수 있다.
class NotUseZeroException(Exception):
    def __init__(self, n):
        super().__init__(f'{n}은 사용할 수 없습니다.')


def div_cal(n1, n2):
    if n2 == 0:
        raise NotUseZeroException(n2)

    else:
        print(f'{n1} / {n2} : {n1 / n2}')


inputNum1 = int(input('num1: '))
inputNum2 = int(input('num2: '))

try:
    div_cal(inputNum1, inputNum2)

except NotUseZeroException as e:
    print(e)

0개의 댓글