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

[Python] 파이썬 기초 14/20, 클래스 상속, 예외처리

by jackMK 2023. 11. 7.

<내용정리>

- 관련 파일

14일차_221219.py
0.01MB


- 본문

# 섹션15 응용예제1
class Book:
    def set_info(self, title, author):
        self.title = title
        self.author = author
    def print_info(self):
        print(f'책 제목: {self.title}')
        print(f'책 저자: {self.author}')
book1 = Book()
book2 = Book()
book1.set_info('파이썬', '민경태')
book2.set_info('어린왕자', '생텍쥐페리')
book_list = [book1, book2]
for book in book_list:
    book.print_info()

# 응용예제2
class Watch:
    def set_time(self):
        now = input('현재 시간을 입력하세요 : ')
        hms = now.split(':')  # :으로 분리
        self.hour = int(hms[0])
        self.minute = int(hms[1])
        self.second = int(hms[2])

    def add_hour(self, hour):
        if hour <= 0:
            return
        self.hour += hour
        self.hour %= 24
    def add_minute(self, minute):
        if minute <= 0:
            return
        self.minute += minute
        self.add_hour(self.minute//60)
        self.minute %= 60
    def add_second(self, second):
        if second <= 0:
            return
        self.second += second
        self.add_minute(self.second//60)
        self.second %= 60
    def print_info(self):
        print(f'계산된 시간은 {self.hour}시 {self.minute}분 {self.second}초입니다')

watch = Watch()
watch.set_time()
watch.add_hour(int(input('계산할 시간을 입력하세요 : ')))
watch.add_minute(int(input('계산할 분을 입력하세요 : ')))
watch.add_second(int(input('계산할 초을 입력하세요 : ')))
watch.print_info()



# p282
class Bag:
    count = 0
    def __init__(self):
        Bag.count += 1

    @classmethod
    def sell(cls):
        cls.count -= 1

    @classmethod
    def remain_bag(cls):
        return cls.count

print(f'현재 가방 : {Bag.remain_bag()}개')
bag1 = Bag()
bag2 = Bag()
bag3 = Bag()
print(f'현재 가방 : {Bag.remain_bag()}개')
bag1.sell()
bag2.sell()
print(f'현재 가방 : {Bag.remain_bag()}개')

## 클래스 상속
# p284
class Person:  # 슈퍼클래스(부모클래스)
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print(f'{self.name}가 {food}를 먹습니다')

class Student(Person):  # 서브클래스(자식클래스)
    def __init__(self, name, school):
        super().__init__(name)
        self.school = school

    def study(self):
        print(f'{self.name}는 {self.school}에서 공부를 합니다')

potter = Student('해리포터', '호그와트')
potter.eat('감자')
potter.study()  # study함수에는 매개변수가 없으므로 빈 소괄호

# p286
class Coffee:
    def __init__(self, bean):
        self.bean = bean

    def coffee_info(self):
        print(f'원두 : {self.bean}')

class Espresso(Coffee):
    def __init__(self, bean, water):
        super().__init__(bean)
        self.water = water

    def espresso_info(self):
        super().coffee_info()
        print(f'물 : {self.water}ml')

coffee = Espresso('콜롬비아', 30)
coffee.espresso_info()

### 섹션17 예외처리 p290
## 예외 종류
# SyntaxError : 잘못된 문법
print('asdf)
print((asdf)

# NameError : 참조변수 없음
a = 10
b = 22
print(c)

# ZeroDivisionError : 0 나누기 에러
print(10/0)

# IndexError : 인덱스 범위 에러
x = [1, 2, 3]
print(x[3])

# KeyError : 잘못된 키
dic = {'name' : '홍길동', 'age' : 20}
print(dic['hobby'])  # 에러
print(dic.get('hobby'))  # 에러 안나고 None을 반환(get함수 사용)

# ValueError : 참조 값이 없을 때
x = [1, 4, 10]
x.remove(100)

# TypeError : 자료형에 맞지 않는 연산을 수행할 경우
x = [1, 2]
y = (1, 2)
z = 'Hello'
print(x + y + z)  # 서로 다른 자료형이기 때문에 성립 X

## 모든 예외를 처리하는 방식 ( try ~ except )
try:
    num = int(input('정수를 입력하세요: '))
    print('원의 반지름 : ', num)
    print('원의 둘레 : ', num * 3.14 * 2)
    print('원의 넓이 : ', num**2 * 3.14 )
except:
    print('정수를 입력하지 않았습니다')

# p297
try:
    height = input('키를 입력하세요 : ')
    height = round(height)
    print(f'입력하신 키는 {height}cm로 처리됩니다')
except:
    print('예외 발생')

## 특정 예외 처리
try:
    a = int(input('제수를 입력하세요: '))
    b = int(input('피제수를 입력하세요: '))
    print(f'{a}/{b} = {a/b}')
except ZeroDivisionError:
    print('0으로 나눌 수 없습니다')
except ValueError:
    print('정수만 입력할 수 있습니다')
except Exception:
    print('알 수 없는 에러가 발생했습니다')

## 예외 메시지 처리하기
a = [10, 20, 30, 40, 50]
try:
    print(a[10])
except IndexError as e:
    print(e)

## else문과 finally문
else : 예외 발생하지 않고 정상적으로 처리될 때 실행되는 구문
finally : 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문
            예외 발생 여부와 관계 없이 무조건 실행해야 할 경우에 사용
try 는 단독으로 사용할 수 없고, 반드시 except 또는 finally 와 함께 사용해야 함
else 는 반드시 except 뒤에 사용해야 함

# ex)
try:
    num = int(input('정수를 입력하세요: '))
except:
    print('정수를 입력하지 않았습니다')
else:
    print('원의 반지름 : ', num)
    print('원의 둘레 : ', num * 3.14 * 2)
    print('원의 넓이 : ', num**2 * 3.14)
finally:  # 무조건 실행
    print('일단 프로그램이 끝났습니다')

loading