Python中为何使用list(dict_keys())转换类属性时返回空列表?
问题原因解析
核心问题出在Python类属性的执行时机上:类里所有顶层的属性赋值,都是在类代码被加载执行的那一刻完成的,不是等你创建实例之后才计算。
用
available_books = Book.book_data.keys()时,dict_keys是字典的动态视图对象——它不会立刻生成固定的列表,而是每次你访问它的时候,才去读取book_data的当前键。所以哪怕之后你创建Book实例往book_data里加了书,访问Library.available_books时,这个视图会实时返回最新的键集合,自然能看到['Book1','Book2']。改成
available_books = list(Book.book_data.keys())后,list()函数在类定义刚加载的时候就执行了,这时候你还没创建任何Book实例,book_data是空字典,所以生成的就是个空列表。这个列表是静态的,之后往book_data里加的内容不会自动同步到这个列表里,所以打印出来就是空的。
如果想让可用书籍列表实时更新,别用静态类属性,改成类方法更合适:
class Library: class Book: book_data = {} def __init__(self, title, year, isbn, author): self.title = title self.year = year self.isbn = isbn self.author = author Library.Book.book_data[title]={'Date Published':year,'ISBN':isbn,'Author':author} def __init__(self, username): self.username = username self.borrowed_books = [] def checkout_book(self, book_name): pass def return_book(self, book_name): pass @classmethod def get_available_books(cls): return list(cls.Book.book_data.keys())
之后调用Library.get_available_books(),每次都会返回最新的可用书籍列表。
内容的提问来源于stack exchange,提问作者yerdeth
相关产品推荐
相关产品推荐

