我在Python中经历了(对我来说)非常奇怪的问题。
我有一个名为Menu的课程:(片段)
class Menu:
"""Shows a menu with the defined items"""
menu_items = {}
characters = map(chr, range(97, 123))
def __init__(self, menu_items):
self.init_menu(menu_items)
def init_menu(self, menu_items):
i = 0
for item in menu_items:
self.menu_items[self.characters[i]] = item
i += 1
当我实例化该类时,我会传入一个字典列表。字典是使用此功能创建的:
def menu_item(description, action=None):
if action == None:
action = lambda : None
return {"description": description, "action": action}
然后列表就像这样创建:
t = [menu_item("abcd")]
m3 = menu.Menu(t)
a = [ menu_item("Test")]
m2 = menu.Menu(a)
b = [ menu_item("Update", m2.getAction),
menu_item("Add"),
menu_item("Delete")]
m = menu.Menu(b)
当我运行程序时,我每次都会获得相同的菜单项。我用PDB运行程序,一旦创建了一个类的另一个实例就找到了,所有以前类的menu_items都设置为最新列表。看起来好像menu_items成员是静态成员。
我在这里监督什么?
答案 0 :(得分:16)
menu_items
dict是一个在所有Menu
个实例之间共享的类属性。像这样初始化它,你应该没问题:
class Menu:
"""Shows a menu with the defined items"""
characters = map(chr, range(97, 123))
def __init__(self, menu_items):
self.menu_items = {}
self.init_menu(menu_items)
[...]
查看Python tutorial section on classes,了解有关类属性和实例属性之间差异的更全面的讨论。
答案 1 :(得分:5)
由于Pär回答了你的问题,这里有一些随意的建议:dict
和zip
是非常有用的功能: - )
class Menu:
"""Shows a menu with the defined items"""
characters = map(chr, range(97, 123))
def __init__(self, menu_items):
self.menu_items = dict(zip(self.characters, menu_items))