본문 바로가기
Python

(파이썬 다시 보기)파이썬, python: 4. 클래스, 제너레이터와 이너레이터, 예외처리

by 하방주인장 2023. 5. 4.

목차

     

    1. 클래스

    1-1. 클래스 생성

    - __init__: 매서드 생성자

    # 학생 정보 관리 시스템
    class Student: # class 이름은 앞에 대문자로 사용
        def __init__(self,name,id,major): 
            self.name = name # 개체 변수를 의미함 (self.변수명)
            self.id = id
            self.major = major
            self.grades = []
    
        def add_grade(self, grade):
            self.grades.append(grade)
        
        def average_grade(self):
            if not self.grades:
               return 0
            else:
                return sum(self.grades) / len(self.grades)
                
    student_1 = Student('홍길동', '0001', 'Data Science')
    student_1.name
    >>> '홍길동'
    student_1.average_grade()
    >>> 0
    
    student_1.add_grade(100)
    student_1.add_grade(80)
    student_1.average_grade()
    >>> 90.0

     

    3-2. 상속과 매서드 오버라이딩

    - 상속: class 클래스 이름(상속할 클래스 이름)

    - 매서드 오버라이딩: 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것

     # 상품 정보 관리
    class Product:
        def __init__(self, name, price): # Product 클래스 init 함수
            self.name = name
            self.price = price
        
        def get_name(self):
            return self.name
        
        def get_price(self):
            return self.price
            
    class Book(Product): #부모 Project를 상속받아 Book을 만든다
        def __init__(self, name, price, author):
            super().__init__(name, price) # Product 클래스 init 함수
            self.author = author
    
        # 오버라이딩: 부모가 정의한 함수를 가져다가 변경함
        def get_name(self):
            return self.name.upper()
        
        def get_author(self):
            return self.author
            
    book = Book('Harry Potter', 20000, 'J.K. Rowling')
    book.get_name()
    >>> 'HARRY POTTER'
    
    product_1 = ('snack', 2000)
    prodect_1.get_author # 에러: 자식에 있는 함수는 사용 못함
    >>> NameError: name 'prodect_1' is not defined

     

    2. 제너레이터와 이너레이터

    2-1. 제너레이터

    def make_bread(n): #n: 총 몇 개를 만들지
        for i in range(n):
            bread = '빵' + str(i+1)
            yield bread
    
    def package_bread(bread):
        print(f'{bread} 포장 완료!')
    
    n = 5
    make_bread_gen = make_bread(n)
    type(make_bread_gen)
    >>> generator
    
    # 한 번 셀 실행이 한 번의 요청
    bread = next(make_bread_gen)
    package_bread(bread)
    >>> 빵1 포장 완료!
    
    for bread in make_bread_gen:
        package_bread(bread)
    >>> 빵2 포장 완료!
        빵3 포장 완료!
        빵4 포장 완료!
        빵5 포장 완료!

     

    2-2. 이터레이터

    class Season:
        def __init__(self):
            self.data = ["봄", "여름", "가을", "겨울"]
            self.index = 0
        def __iter__(self):
            return self
        def __next__(self):
            if self.index < len(self.data):
                cur_season = self.data[self.index]
                self.index += 1
                return cur_season
            else:
                raise StopIteration
    
    season = Season()
    season.data
    >>> ['봄', '여름', '가을', '겨울']
    
    next(season)
    >>> '봄'
    
    next(season)
    >>> '여름'
    
    season.data
    >>> ['봄', '여름', '가을', '겨울']

     

     

    3. 예외 처리

    3-1. try, except 문

    try: 
       result = 10 / 0
    except ZeroDivisionError as e: #내장 클래스
       print(e)
    >>> division by zero
    
    try: 
       print(no_variable)
       result = 10 / 0
    except NameError as e: #내장 클래스
       print(e)
    except ZeroDivisionError as e: #내장 클래스
       print(e)
    >>> name 'no_variable' is not defined

     

    3-2. try, finally

    - 예외 발생 여부와 상관없이 finally절에서 f.close()로 열린 파일을 닫을 수 있다.

    try:
        f = open('foo.txt', 'w')
        # 무언가를 수행한다.
    
        (... 생략 ...)
    
    finally:
        f.close()  # 중간에 오류가 발생하더라도 무조건 실행된다.

     

    3-3. try, else

    - try문 수행중 오류가 발생하면 except절이 수행되고 오류가 없으면 else절이 수행된다.

    try:
        age=int(input('나이를 입력하세요: '))
    except:
        print('입력이 정확하지 않습니다.')
    else:
        if age <= 18:
            print('미성년자는 출입금지입니다.')
        else:
            print('환영합니다.')
    >>> 나이를 입력하세요: d
    >>> 입력이 정확하지 않습니다.
    >>> 나이를 입력하세요: 15
    >>> 미성년자는 출입금지입니다.

     

    댓글