본문 바로가기

Back-End/Python

파이썬 실습2 - 도서 입고/대출/반납 관리를 위한 키오스크 만들기 (데코레이터)

~ 목차 ~

< 데코레이션 형태 >

class 클래스 명:
    def decorator_function1():
        def wrapper():
    @decorator_function1
    def 매입함수

    def decorator_function2():
        def wrapper():
    @decorator_function2
    def 대출함수
    
    def decorator_function3():
        def wrapper():
    @decorator_function3
    def 반납함수

 

<기존 키오스크로 바꾸어 보기>

class LibraryKiosk:
    #초기생성자
    def __init__(self):
         #books는 맴버변수
         self.books = {}
         print('클래스 생성 되었습니다.')
    #-------------------------------------------------------    
    #도서 입고 데코레이터 함수 정의하기
    def decorator_function(func):
        def wrapper(self, book_id, title, quantity):
            func(self, book_id, title, quantity)
            # return  func
        return wrapper
    @decorator_function
    def add_book(self, book_id, title, quantity):
        if book_id in self.books:
            self.books[book_id]['quantity'] += quantity  
        else:
            self.books[book_id] = {'title':title, 'quantity':quantity}
        print(f"도서번호 : {book_id} /제목 : {title} / 입고수량 : {quantity} 입고 성공!!")
        
    #도서 대출
    def decorator_function(func):
        def wrapper(self, book_id):
            func(self, book_id)
        return wrapper    
    @decorator_function
    def borrow_book(self, book_id):
        if (book_id in self.books) and (self.books[book_id]['quantity']) > 0 :
            self.books[book_id]['quantity'] -= 1
            print("대출이 완료되었습니다.")
            print(f"도서번호:{book_id} / 제목:{self.books[book_id]['title']} / 남은재고수량:{self.books[book_id]['quantity']}")
        else:
            print("도서가 존재하지 않거나, 대출할 재고가 없습니다.")

    #도서 반납
    # def decorator_function(func):
    #     def wrapper(self, book_id):
    #         func(self, book_id)
    #     return wrapper
    @decorator_function
    def return_book(self, book_id):
        if book_id in self.books:
            self.books[book_id]['quantity'] += 1
            print(f"도서번호:{book_id} / 제목:{self.books[book_id]['title']} / 남은재고수량:{self.books[book_id]['quantity']}")

        else:
            print("해당 도서가 존재하지 않습니다.")
    #------------------------------------------------------------
#메인함수            
def main():
    kiosk = LibraryKiosk()
    print(kiosk)
    
    while True:
        print('<도서 키오스크 메뉴>')
        print('1. 도서 입고')
        print('2. 도서 대출')
        print('3. 도서 반납')
        print('4. 종료')

        choice = input('원하는 번호(1~4)를 선택하세요 : ')

        if choice == '1':
            book_id = input('도서 번호를 입력해 주세요 : ')
            title = input('도서 제목을 입력해 주세요 : ')
            quantity = int(input('입고할 권수를 입력해 주세요 : '))

            #add_book 호출되는 순간에 wrapper가 같이 실행(데코레이터 되었으므로)
            kiosk.add_book(book_id, title, quantity)
            
        elif choice == '2':
            book_id = input("대출할 도서번호를 입력해주세요 : ")
            kiosk.borrow_book(book_id)
            
        elif choice == '3':
            book_id = input("반납할 도서번호를 입력해주세요 : ")
            kiosk.return_book(book_id)
            
        elif choice == '4':
            print('종료 선택')
            break
            
        else:
            print('잘못 선택하였습니다. 다시 선택해 주세요!')

### 1. 최초 코드 시작
if __name__ == "__main__":
    main()

결과

클래스 생성 되었습니다.
<__main__.LibraryKiosk object at 0x00000292562FCE50>
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  1
도서 번호를 입력해 주세요 :  001
도서 제목을 입력해 주세요 :  기초
입고할 권수를 입력해 주세요 :  5
도서번호 : 001 /제목 : 기초 / 입고수량 : 5 입고 성공!!
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  2
대출할 도서번호를 입력해주세요 :  001
대출이 완료되었습니다.
도서번호:001 / 제목:기초 / 남은재고수량:4
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  3
반납할 도서번호를 입력해주세요 :  001
도서번호:001 / 제목:기초 / 남은재고수량:5
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 :  4
종료 선택

728x90