Hello Stack Overflow!
我正在一个程序中执行一个简单的命令,该程序编译库中包含的所有书籍的报告。该库包含一个架子列表,每个架子包含一本书籍字典。然而,尽管我付出了最大努力,但我总是将我的所有书籍都复制在每一个书架上,而不是放在书架上,而不是我指示程序将书放在书架上。
我希望我错过了一些关于对象创建和组织的基本规则。
我相信罪魁祸首是书类中的奴隶和非书架方法。
非常感谢你的时间, 杰克
以下代码:
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()
输出:
<[''决定点','我的生活','马特宏'',['决定点','我的生命','马特洪峰'],['决定点','我的生命','马特洪峰' ]] 没有 [以0.1秒完成]..代替[[“决策点”],[“我的生活”],[“马特霍恩”]]
答案 0 :(得分:2)
dict.pop()
代替del
。self.books = {}
添加到shelf
的{{1}}。不要在__init__
之外声明books
,因为如果你这样做,那个类的所有实例都会引用相同的东西。相反,这会使每个实例都有自己的字典,这当然是你想要的,因为一本书不能同时放在两个书架上。__init__
及其library
和shelves
及其book
执行相同操作。shelf_number
个实例作为参数传递给library
和enshelf
。当您从对象的方法中引用unshelf
时,Python发现没有定义本地SPL
,因此它搜索本地范围之外的一个;但如果您尝试将某些内容分配给SPL
或进行其他类型的变更业务,则会获得SPL
。UnboundLocalError
,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()
。请注意,我不是迭代索引,而是遍历元素本身。如果您想亲眼看看,请在交互式shell中尝试return [shlf.get_books() for shlf in self.shelves]
。