在Python中制作菜单

可能重复:
在Python中使用函数名称调用函数

我想我可以写一些可怕的代码来做到这一点,但我更愿意看到'干净的版本'。

对我而言,最好的方法是制作一个字典,其中包含给定对象可以使用的各种功能。 然后,当用户被指示告诉对象它正在做什么时,它会根据该字典吐出一个菜单。

我搜索了一下,并没有看到适用于我的东西,所以我想我会试试看。 那么,它没有工作。

class Man(object):
    def __init__(self):
        self.cmds = ['foo', 'bar']

    def foo(self):
        print "Foo called."

    def bar(self):
        print "Bar called."

    def junk(self):
        print "Junk called." ##not in dict, on purpose, will explain

    def menu(self):
        while True:
            print "List of actions:"
            for acts in self.cmds:
                print acts
            cmd = raw_input("> ")
            if cmd in self.cmds:
                cmd()    ##doesn't work.
                         ##neither did self.cmd() (got AttributeError, obviously)

                result = getattr(self, cmd)() ## this works! thanks cdhowie
            else:
                pass

Stick = Man()
Stick.menu()

如果不是很明显,那么只要我输入if-else认为是True的东西,程序就会给出TypeError - 在这种情况下,输入'foo'或'bar'。 这是事情,是我知道我可以在这里写一个长长的丑陋的其他东西,并让这个例子工作 - 但我希望能够从self.cmds中追加/移除以改变对象的功能。 因此第三个函数Junk(); Stick不能从当前的词典菜单中访问'Junk()',但是需要一点self.cmds.append动作,我希望它能够。

F Python,他们是如何工作的? 这是正确的方式去做这件事,还是有一个更简单的方法?

编辑:我的答案被发现在getattr的魔力。 谢谢cdhowie。 诀窍是改变while循环来得到这个位:result = getattr(self,cmd)()

我现在知道我的下一个任务是最终弄清楚getattr()实际上做了什么。 原谅我的noob地位,嘿,我不知道我的代码:)

最终编辑:虽然cdhowie的例子与原始程序一起工作,但是我后来发现ders的答案允许我在功能上做事情,这是我无法用getattr()完成的。 ders的解决方案使我更容易在Man的init中使用其他对象中的函数 - 我认为这就是所谓的“对象组合”的权利? 无论如何,getattr()会将AttributeError从除Man之外的任何地方添加到self.cmds中。 或者我可能再次变得很奇怪。 但足以说明,ders FTW。


在你的例子中,Man.cmds是一个不是字典的列表。 因此,当self.cmds列表中的字符串作为函数调用时,会引发TypeError。

使用函数名称作为与函数本身配对的字符串创建一个字典。

    def __init__(self):
        self.cmds = {'foo':self.foo, 'bar':self.bar}

在您的菜单功能中,检查用户是否输入了有效的功能名称。 如果是这样,将其从字典中拉出来并调用它。

            if cmd in self.cmds:
                command = self.cmds[cmd]
                command()
            else:
                pass

要动态添加垃圾功能,您可以update cmds:

Stick.cmds.update({'junk':Stick.junk})
链接地址: http://www.djcxy.com/p/55169.html

上一篇: Making a menu in Python

下一篇: Call a function from a stored string in Python