Python参考问题

Ikk*_*kke 3 python reference

我在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
Run Code Online (Sandbox Code Playgroud)

当我实例化该类时,我传入一个字典列表.使用此功能创建词典:

def menu_item(description, action=None):
    if action == None:
        action = lambda : None
    return {"description": description, "action": action}
Run Code Online (Sandbox Code Playgroud)

然后列表创建如下:

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)
Run Code Online (Sandbox Code Playgroud)

当我运行我的程序时,我每次都获得相同的菜单项.我用PDB运行程序,并在创建类的另一个实例后立即找到,所有先前类的menu_items都设置为最新列表.看起来好像menu_items成员是静态成员.

我在这里监督什么?

Pär*_*der 16

menu_items字典是这一切之间共享的类属性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)

    [...]
Run Code Online (Sandbox Code Playgroud)

查看关于类Python教程部分,以便更深入地讨论类属性和实例属性之间的区别.

  • 不,这是因为您将`menu_items`定义为类属性(直接在`类Menu`中),而不是作为实例属性(在类的方法内初始化). (4认同)

Joc*_*zel 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))
Run Code Online (Sandbox Code Playgroud)