본문으로 바로가기

도서관 클래스

category 기초지식/파이썬 2019. 1. 2. 20:09

Library 클래스

- 도서관 클래스: Book 의 인스턴스를 가지고 User 클래스를 통해 만들어진 인스턴스들과 속성을 주고받음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Library:
    def __init__(self, name, book_list=[]):
        self.name = name
        self.book_list = book_list
        
    def __repr__(self):
        return f'{self.name}, {self.book_list}'
        
    def add_book(self, book_title):
        for book in self.book_list:
            if book.title == book_title:
                print(f'{book_title}은 이미 있습니다.')
                break
        else:
            self.book_list.append(Book(book_title, self))
            print(f'{book_title} 이(가) 입고 되었습니다.')
    
    def remove_book(self, book_title):
        for book in self.book_list:
            if book.title == book_title:
                self.book_list.remove(book)
                print(f'{book.title} 을 폐기 처분했습니다.')
                break
        else:
            print(f'{book_title} 은 저희 도서관에 없습니다.')
    
cs



Book 클래스

- 도서 클래스: 특별한 기능(메서드) 없이 Library 클래스와 User 클래스 사이에서 이 인스턴스의 교환(append, remove) 가 이루어짐


1
2
3
4
5
6
7
8
class Book:
    def __init__(self, title, location):
        self.title = title
        self.location = location
        
#     def __repr__(self):
#         return self.title
 
cs



User 클래스

- 사용자 클래스: User 의 인스턴스로 Library 의 인스턴스에서 소유한 book 인스턴스들을 가지고 오고 반환하는 기능을 함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class User:
    def __init__(self, name, book_list=[]):
        self.name = name
        self.book_list = book_list
        
    def borrow_book(self, library, book_title):
        for book in library.book_list:
            if book.title == book_title:
                self.book_list.append(book)
                library.book_list.remove(book)
                print(f'[{book.title}] 대출이 완료되었습니다.')
                break
        
        else:
            print(f'[{book_title}]은(는) {library.name} 에 없습니다.')
    
    def return_book(self, library, book_title):
        for book in self.book_list:
            if book.title == book_title:
                self.book_list.remove(book)
                library.book_list.append(book)
                print(f'{book.title} 이 반납되었습니다.')
                break
                
        else:
            print(f'{book.title}은(는) 소유하고 있지 않습니다.')
cs



Library 의 인스턴스 생성


1
2
3
4
5
6
7
8
9
10
11
12
library1 = Library('사당 도서관')
 
library1.add_book('처음 시작하는 파이썬')
# 처음 시작하는 파이썬 이(가) 입고 되었습니다.
 
 
library1.add_book('전문가를 위한 파이썬')
# 전문가를 위한 파이썬 이(가) 입고 되었습니다.
 
library1.book_list
# [<__main__.Book at 0x103d9f898>, <__main__.Book at 0x103d9f940>]
 
cs



문제해결


1) 기본적인 문제이지만.... library.book_list 를 하면 위와 같이 Book 객체의 주소만 나오는 것이었다.


2) 그래서 Library 클래스에서 __repr__ 메서드로 self.book_list 를 리턴시켰지만 여전히 동일한 결과가 나왔다.


3) 가만히 생각해보면 Book 클래스를 통해서 만들어진 인스턴스임을 확인했다. <__main__.Book at --->


4) 즉, Book 클래스에서 __repr__ 메서드로 정의하니 원하는 결과값으로 나오는 것으로 해결이 완료되었다.


1
2
3
library1.book_list
# [처음 시작하는 파이썬, 전문가를 위한 파이썬]
 
cs



기본 중에 기본적인 문제라 포스팅에 남겨둔다는 것 자체가 흑역사이지만 이 또한 내가 부족해서 발생한 결과이기 때문에 반성하고 같은 실수가 없게 해야겠다.


Library 와 User 클래스에서 Book 으로 만들어진 인스턴스를 교환한다는 것. OOP 의 장점인 캡슐화로 이와같은 코드 구현이 가능하다는 것을 잊지말자.


'기초지식 > 파이썬' 카테고리의 다른 글

isdigit(), isalpha() 함수  (0) 2019.03.19
딕셔너리의 get 함수 사용해보기  (0) 2019.01.14
파이썬 getter 와 setter  (0) 2018.12.31