Python 3.4.3 - 具有相同信息的多个对象

时间:2015-07-09 09:31:22

标签: python

在我的

class Library(object):

def __init__(self):
     self.books = []


def add_book(self, book):
    if book.get_title() not in self.books:
        self.books.append(book)
else:
    print("This book is already added.")

然后在我的主要()中得到了:

if command == "add":

    title = input("Please type in the title of the book:")

    author = input("Please type in the author of the book:")

    year = int(input("Please type in the year of the book:"))

    my_lib.add_book( Book(title, author, year) )

    print("The book has been added.")

elif command == "view":
    my_lib.view_library()

elif command == "get":

    book_title = input("Please type in the title of the book:")
    book = my_lib.find_book(book_title)
    if book != False:
        print("Here's the book:")
        print("Title:", book.get_title() + ".\nAuthor:",
          book.get_author() + ".\nYear:",
          str(book.get_year()) + ".\nBorrowed:",
          str(book.get_borrowed()) + ".\n")


    else:
        print("This book does not exist.")

elif command == "borrow":
    book_title = input("Type in the title of the book you want to borrow:")
    book = my_lib.find_book(book_title)
    if book != False and book.get_borrowed() == None:
        pass

    elif book == False:
        print("This book does not exist in our catalog!")
    else:
        print("This book is already borrowed!")

我的问题是,当我添加几本具有相同标题,作者和年份的书籍时,我只能借用其中一本书。可能是一个简单的解决方案,但我被困住了。我还想使用另一个名为User的类,我可以存储所有人的名字,而不是仅仅在借用函数中执行:

    ##name = input("Please type in your name:")
    ##book.set_borrowed(name)

我现在已经通过了。我得到了另一个只是书的课。与所有正常的吸气剂和孵化器。

澄清,这不起作用:

def add_book(self, book):
    if book.get_title() not in self.books:
        self.books.append(book)

This doesnt work. I can still add a book with the exact same info including title!    

2 个答案:

答案 0 :(得分:2)

我认为您需要重新考虑您的计划。

如果您创建两本具有相同属性值的图书,则客户无法区分它们。

一种可能性是为每本书添加一个唯一的ID(使用Book类中的类变量随每本书增加)并使用此ID借书。另一种可能性是存储一种类型的书中有多少种可用。您可以使用book类中的int计数器来实现它。如果添加了具有匹配属性的书籍,则增加它;如果计数器大于0(=可用书籍)并且调用“get”命令,则减少。

这应该适用于您的问题。

BTW:setter和getter不是pythonic。在python中,您通常使用直接访问属性。如果您需要进一步处理(值检查等),您可以使用属性。

答案 1 :(得分:0)

如果您不需要对同一本书的副本进行区分,或者添加一个唯一的ID(在Book类中或者在同一个类中),您可以添加书籍数量作为Book类的属性,或者更好地添加Book的子类。一个子类)如果你想对它们进行区分。事实上,人类图书管理员会在一个真正的图书馆里做多少本同一本书的副本:-)(永远不要忘记真正的问题......)

假设您只需要相同书籍的数量,但想知道现有书籍的数量和借用的部分,实施可能是:

class LibBook(Book):
    def __init__(self, nb, *bookParams):
        super(Book, self).__init__(*bookParams)
        self.count = nb
    def add_copies(nb = 1): # nb can be <0 to remove copies
        'add nb new copies of the book (if nb < 0 removes them)'
        if (self.present + nb) < 0:
            raise Exception('Not enough books')
        self.count += nb
        self.present += nb
    def borrow(n = 1):
        if self.present < n:
            raise Exception('Not enough books')
        self.present -= n
    def return(n = 1):
        if self.present + n > self.count:
            raise Exception('Not so many books were borrowed')
         self.present += n

然后你可以重写,提供的书是一本LibBook

def add_book(self, book):
    if book.get_title() not in self.books:
        self.books.append(book)
    else
        book.add_copies(1)

你应该调整程序的借用部分......