0

你好堆栈溢出!

我正在一个程序中执行一个简单的命令,该程序编译图书馆中所有书籍的报告。图书馆包含一个书架列表,每个书架都包含一本书籍词典。然而,尽管我尽了最大的努力,我总是复制我所有的书并将它们放在每个书架上,而不是我指示程序放置书的书架上。

我希望我错过了对象创建和组织的某种基本规则。

我认为罪魁祸首是 book 类中的 enshelf 和 unshelf 方法。

非常感谢您抽出宝贵的时间,杰克

下面的代码:

class book():   

    shelf_number = None

    def __init__(self, title, author):
        super(book, self).__init__()
        self.title = title
        self.author = author

    def enshelf(self, shelf_number):
        self.shelf_number = shelf_number
        SPL.shelves[self.shelf_number].books[hash(self)] = self

    def unshelf(self):  
        del SPL.shelves[self.shelf_number].books[hash(self)]
        return self

    def get_title(self):
        return self.title

    def get_author(self):
        return self.author

class shelf():

    books = {}

    def __init__(self):
        super(shelf, self).__init__()

    def get_books(self):
        temp_list = []

        for k in self.books.keys():
            temp_list.append(self.books[k].get_title())
        return temp_list

class library():

    shelves = []

    def __init__(self, name):
        super(library, self).__init__()
        self.name = name

    def make_shelf(self):
        temp = shelf()
        self.shelves.append(temp)

    def remove_shelf(shelf_number):
        del shelves[shelf_number]

    def report_all_books(self):

        temp_list = []

        for x in range(0,len(self.shelves)):
            temp_list.append(self.shelves[x].get_books())

        print(temp_list)

#---------------------------------------------------------------------------------------
#----------------------SEATTLE PUBLIC LIBARARY -----------------------------------------
#---------------------------------------------------------------------------------------

SPL = library("Seattle Public Library")                     

for x in range(0,3):
    SPL.make_shelf()

b1 = book("matterhorn","karl marlantes")
b2 = book("my life","bill clinton")
b3 = book("decision points","george bush")

b1.enshelf(0)
b2.enshelf(1)
b3.enshelf(2)

print(SPL.report_all_books())

b1.unshelf()
b2.unshelf()
b3.unshelf()

输出:

[['decision points', 'my life', 'matterhorn'], ['decision points', 'my life', 'matterhorn'], ['decision points', 'my life', 'matterhorn']] 无【0.1s完成】

..而不是[[“决策点”],[“我的生活”],[“马特宏峰”]]

4

1 回答 1

2
  1. 使用dict.pop()而不是del.
  2. 添加self.books = {}到. shelf_ __init__不要books在 之外声明__init__,因为如果这样做,该类的所有实例都将引用同一事物。相反,这使得每个实例都有自己的字典,这当然是你想要的,因为一本书不能同时放在两个书架上。
  3. library对和它的shelvesbook它的做同样的事情shelf_number
  4. library将实例作为参数传递给enshelfand unshelf。当您从对象的方法中引用时SPL,Python 发现没有本地SPL定义,因此它会在本地范围之外搜索一个;但是,如果您要尝试分配某些东西SPL或做一些其他类型的变异业务,您会得到一个UnboundLocalError.
  5. 奖金:
    • class book(object), class shelf(object), 和class library(object). (不会解决您的问题,但无论如何您都应该这样做。)
    • 您不需要在使用它们之前对密钥进行哈希处理,它们将被哈希处理(如果它们是可哈希的,但如果您正在对它们进行哈希处理,那么它们就是)。
    • 除非您从某些东西继承,否则无需调用super(),在这种情况下,您可以将方法调用委托给使用它的父级或兄弟级 - 但您没有这样做。
    • get_books()可以实现为无非return [self.books[k].get_title() for k in self.books.iterkeys()]
    • 同样对于report_all_books(): return [shlf.get_books() for shlf in self.shelves]。请注意,我不是迭代索引,而是迭代元素本身。for c in "foobar": print(c)如果您想亲自查看,请尝试使用交互式 shell。
于 2013-07-24T22:50:16.760 回答