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 |