클래스를 이용하여 도서관리 프로그램을 짜보자

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


    Library
        attrs
            name: 도서관명 (str)
            book_list: 도서 목록 (Book인스턴스의 목록) (list)
        methods
            add_book (책 제목을 받아서 새로운 Book을 생성, self.book_list에 추가)
            remove_book (책 제목을 받아서 해당 제목의 Book을 self.book_list에서 삭제)
        property
            info: 가지고 있는 도서 목록을 보기좋은 텍스트로 리턴 (빌려간 도서는 출력 안해도 됨)
            -> print(library1.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 Library(): 
    
    	def __init__(self, name): #매서드초기화
			self.name = name #이름초기화
			self.book_list = [] # 새로 
  
    	def add_book(self, book): #도서관에 책을 추가
        	if book in self.book_list: #책이 이미 리스트에 있으면 프린트
           		 print('이미 소장중입니다.')
            
        else : 
            self.book_list.append(book) #책이 없으면 리스트에 추가
            book.is_borroweds = True #책을 빌릴수있는 상태로 전환
            book.location = self.name #책의 위치는 name 즉 도서관이다.
            print(f'{book.title} 이 도서관에 추가되었습니다.') #알림 메세지
    
	    def remove_book(self, book): #책을 치우는 기능
			if book in self.book_list:   #책이 리스트에 있어야 실행
			    self.book_list.remove(book) #책을 제거
			    book.is_borroweds = None #책을 빌릴수없음 (책이없음)
			    book.location = None #마찬가지
			    print(f'{book.title} 이 도서관에서 삭제되었습니다.') #책이 없어짐을 알림
			else: 
			    print('없는 책입니다.') #책이 없습니다.
		    
	    	@property #get,set을 쉽게 하기위한 정의
		    def info(self): #인포
			print(f'도서관: {self.name}\n 장서목록: {[i.title for i in self.book_list]}') 현재 도서관이름과 장서목록

	class Book():
	    def __init__(self, title): #메서드 초기화
			self.title = title
			self.location = None #책을 처음 입력할땐 위치가없어야한다
			is_borroweds = None #책을 처음 입력할댄 역시 빌린사람도없다
    
	    @property #전과 동일
	    def is_borrowed(self): #누가 빌려갔으면 F 아니면 T 등록이안되어있으면 None
			if self.is_borroweds == False:
			    print( '대여중')
			elif self.is_borroweds == True:
			    print ('대여가능')
			else :
			    print ('책이 없음')

	    @property #이역시 동일
	    def info(self): #책의 정보
			print(f'제목 : {self.title}\n소재지: {self.location}\n대여여부: {self.is_borrowed}')
    
	class User():

	    def __init__(self, name): #매서드 초기화
			self.name = name
			self.book_list = [] #빌린사람의 북리스트
		
	    def borrow_book(self, library, book): #책을빌려보자
		if book in self.book_list: #책이있네
		    print ('이미 소장중인 도서입니다.') #프린트
		else: #책이없다면
		    library.book_list.remove(book) #도서관책을지우고
		    self.book_list.append(book) #이용자의 리스트에 추가
		    book.location = self.name #책의 위치는 사람이름을 출력
		    book.is_borroweds = False #책이 빌려졌음
		    print (f'{library.name} 에서 {book.title}을(를) 빌렸습니다.  {[i.title for i in self.book_list]}') #프린트
	    
	    def return_book(self, library, book): #책을 반납해보자
		if book in self.book_list: #책이 이용자 리스트에있다면
		    self.book_list.remove(book) #이용자 리스트에서 제거
		    library.book_list.append(book) #도서관에 다시 추가
		    book.location = library.name #위치는 다시 도서관으로
		    book.is_borroweds = True #책을 다시 빌릴 수 있음
		    print (f'{self.name}{book.location}{book.title}을 반납했습니다. {[i.title for i in self.book_list]}') #프린트
		else: #책이없으면
		    print('해당하는 도서가 없습니다.') #프린트
	    
	    @property #전과 동일
	    def info(self): #이용자의 상태
		print (f'이름: {self.name}\n소장목록: {[i.title for i in self.book_list]}') #프린트

이상 매니져님의 도움으로 코드를 짜보았다.