본문 바로가기
학부 자료/Python

[Python] 파이썬 기초 15/20, 클래스 상속, 예외처리 2(강제로 예외 발생)-raise 예제

by jackMK 2023. 11. 7.

<내용정리>


- 관련 파일

15일차_221221.py
0.01MB


- 본문

# 섹션 16  p 287 응용예제 1
class Person:
    population = 0

    def __init__(self, name):
        self.name = name
        Person.population += 1
        print(f'{self.name} is born')

    def __del__(self):
        Person.population -= 1
        print(f'{self.name} is dead')

    @classmethod
    def get_population(cls):
        return cls.population

man = Person('james')
wonman = Person('emily')
print(f'전체 인구수 : {Person.get_population()}명')
del man
print(f'전체 인구수 : {Person.get_population()}명')

# 응용예제 2
class Shop:
    total = 0
    menu_list = [
        {'떡볶이':3000},
        {'순대':3000},
        {'튀김':500},
        {'김밥':2000}
    ]
    @classmethod
    def sales(cls, food, count):
        for menu in cls.menu_list:
            if food in menu:
                cls.total += (menu[food] * count)
Shop.sales('떡볶이', 1)
Shop.sales('김밥', 2)
Shop.sales('튀김', 5)
print(f'매출: {Shop.total}원')

# 응용예제 3
class Car:
    max_oil = 50
    def __init__(self, oil):
        self.oil = oil

    def add_oil(self, oil):
        if oil <= 0:
            return
        self.oil += oil
        if self.oil > Car.max_oil:
            self.oil = Car.max_oil
    def car_info(self):
        print(f'현재 주유상태 : {self.oil}')

class Hybrid(Car):
    max_battery = 30
    def __init__(self, oil, battery):
        super().__init__(oil)
        self.battery = battery
    def charge(self, battery):
        if battery <= 0:
            return
        self.battery += battery
        if battery > Hybrid.max_battery:
            self.battery = Hybrid.max_battery
    def hybrid_info(self):
        super().car_info()
        print(f'현재 충전상태: {self.battery}')

car = Hybrid(0, 0)  # 인스턴스 생성(>>초깃값 설정)
car.add_oil(49)
car.charge(32)
car.hybrid_info()

## 강제로 예외 발생시키기(raise) p302
예외를 강제로 발생시킴
1. 프로그램 개발 단계에서 아직 구현되지 않은 부분에 일부러 예외를 발생시켜
    잊어버리지 않도록 하는 경우에 활용
2. 파이썬이 예외로 인식하지 못하지만 실제로는 예외인 경우(ex. 나이)

# ex)
num = int(input('정수를 입력하세요: '))
if num > 0:
    raise '아직 구현되지 않은 코드입니다'
else:
    print('0 또는 음수입니다')

# p303 기본예제
try:
    score = int(input('점수를 입력하세요 : '))
    if score < 0 or score > 100:
        raise Exception('점수는 0~100 사이입니다')
except Exception as e:
    print(e)
else:
    if score >= 80:
        print(f'{score}점은 합격입니다')
    else:
        print(f'{score}점은 불합격입니다')

## pass
예외가 발생하면 바로 처리해야하지만 크게 중요한 부분이 아닐 경우
프로그램의 강제 종료를 막는 목적으로 사용
<형식>
try:
    예외가 발생할 가능성이 있는 코드
except:
    pass

# ex)
li = ['52', '123', '29', '파이썬', '111']
li_num = []  # 숫자만 담을 빈 리스트
for i in li:
    try:
        result = int(i)
        li_num.append(result)
    except:
        pass
print(li_num)

# p305 기본예제
class NameError(Exception):
    def __init__(self, message):
        super().__init__(message)
try:
    name = input('이름을 입력하세요: ')
    if len(name) < 2 or len(name) > 6:
        raise NameError('이름은 2~6자 사이로 입력해 주세요')
except NameError as e:
    print(e)
else:
    print(f'입력된 이름은 {name}입니다')

## 섹션 17 응용예제 1번 p306
class Quiz:
    answer = ['경기도', '강원도', '충청남도', '충청북도', '전라남도', '전라북도', '경상남도', '경상북도', '제주특별자치도']

    @classmethod
    def challenge(cls):
        if not cls.answer:
            print('모든 도를 맞혔습니다 성공하셨습니다')
            return  # 함수 종료
        do = input('정답은? >> ')
        if do not in cls.answer:
            raise Exception('오답입니다')  # 예외 발생
        for i, answer_do in enumerate(cls.answer):
            if do == answer_do:
                print('정답입니다')
                cls.answer.pop(i)  # pop --> 꺼내어 삭제(지정값 삭제)
        cls.challenge()
try:
    print('우리나라 9개의 모든 도를 맞히는 퀴즈입니다. 하나씩 대답하세요')
    Quiz.challenge()
except Exception as e:
    print(e)

# 응용예제 2번
import random
class UpDown:
    def __init__(self):
        self.answer = random.randint(1, 100)
        self.count = 0
    def challenge(self):
        self.count += 1
        n = int(input('입력(1~100) >> '))
        if n < 1 or n > 100:
            raise Exception('1~100 사이만 입력하세요')
        return n
    def play(self):
        while True:
            try:
                n = self.challenge()
            except Exception as e:
                print(e)
            else:
                if self.answer < n:
                    print('Down')
                elif self.answer > n:
                    print('Up')
                else:
                    print(f'{self.count}번만의 정답입니다!!')
                    break
game = UpDown()
game.play()

loading