Python_class 실습

실습 문제

도서 관리 프로그램
    Library, Book, User클래스 구현
        프로그램 시작시 도서 5권 정도를 가진 상태로 시작

    Library
        attrs
            name: 도서관명
            book_list: 도서 목록 (Book인스턴스의 목록)
        methods
            add_book
            remove_book
        property
            info: 가지고 있는 도서 목록을 보기좋은 텍스트로 출력 (빌려간 도서는 출력 안해도 됨)

    Book
        attrs
            title: 제목
            location: 현재 자신이 어떤 Library 또는 User에게 있는지를 출력
        property
            is_borrowed: 대출되었는지 (location이 User인지 Library인지 확인)

    User
        attrs
            name: 이름
            book_list: 가지고 있는 도서 목록
        methods
            borrow_book(library, book_name): library로부터 book을 가져옴
            return_book(library, book_name): library에 book을 다시 건네줌

class 정의


class Book:
    books_title = ['python', 'java', 'swift', 'objectC', 'C++']

    def __init__(self, title, location, is_borrowed=False):
        """
        처음 5권의 책 생성
        books_title 이 빈 리스트인 경우 한권의 책만 생성
        """
        self.location = location
        self.title = title
        self.__is_borrowed = is_borrowed

        if self.books_title:
            self.make_books(location)

    def make_books(self, location):
        """
        책 제목을 통해 Book 인스턴스 생성 그리고 도서관에 책 추가
        """
        for book in self.books_title:
            self.books_title.remove(book)
            book = Book(book, location)
            location.new_book(book)

    @property
    def is_borrowed(self):
        """
        대출 했을 경우 True,
        아닌경우 False
        """
        return self.__is_borrowed

    @is_borrowed.setter
    def is_borrowed(self, new_status):
        self.__is_borrowed = new_status

class Library:
    def __init__(self, name, book_lists=list()):
        self.name = name
        self.book_lists = book_lists

    def new_book(self, book):
        """
        새로운 책 추가하는 함수
        :param book:
        :return:
        """
        self.book_lists.append(book)

    def add_book(self, title):
        """
        책이 반납되었을 경우 실행
        :param title:
        :return:
        """
        for book in self.book_lists:
            if book.title == title:
                book.is_borrowed = False

    def remove_book(self, title):
        """
        책이 대출되었을 경우 실행
        :param title:
        :return:
        """
        for book in self.book_lists:
            if book.title == title:
                book.is_borrowed = True

    @property
    def info(self):
        """
        가지고 있는 도서 목록 출력
        빌려간 도서는 출력 안함
        """
        return print('\n'.join(book.title for book in self.book_lists if not book.is_borrowed))


class User:
    def __init__(self, name, book_lists=list()):
        self.name = name
        self.book_lists = book_lists

    def borrow_book(self, library, book_name):
        library.remove_book(book_name)
        self.book_lists.append(book_name)

    def return_book(self, library, book_name):
        library.add_book(book_name)
        self.book_lists.remove(book_name)

    def __repr__(self):
        return f'{self.name}(이)가 빌린 책: ' + ','.join(self.book_lists)

실행결과


>> fastcamp_library = Library('패스크캠퍼스도서관')
>> book1 = Book('hello world',fastcamp_library)
>> fastcamp_library.new_book(book1)
>> book2 = Book('안녕',fastcamp_library)
>> fastcamp_library.new_book(book2)
>> kahee = User('가희')
>> kahee.borrow_book(fastcamp_library,'안녕')
>> book2.is_borrowed
True
>> fastcamp_library.info
C++
objectC
swift
java
python
hello world
>> kahee
가희() 빌린 : 안녕
>> kahee.return_book(fastcamp_library,'안녕')
>> kahee.book_lists
[]
>> fastcamp_library.info
C++
objectC
swift
java
python
hello world
안녕
>> kahee.borrow_book(fastcamp_library,'python')
>> kahee
가희() 빌린 : python
>> fastcamp_library.info
C++
objectC
swift
java
hello world
안녕