2008-11-13 100 views
3

我怎样才能做这样的事情:课堂内的Dictonaries和Lambda?

class Foo(): 
do_stuff = { 
      "A" : lambda x: self.do_A(x), 
      "B" : lambda x: self.do_B(x) 
     } 
def __init__(self): 
    print "hi" 

def run(self): 
    muh = ['A', 'B', 'A'] 
    for each in muh: 
     self.do_stuff[each](each) 

def do_A(self, moo): 
    print "A" 

def do_B(self, boo): 
    print "B" 

if(__name__ == '__main__'): 
aFoo = Foo() 
aFoo.run() 

这导致它给自我未在lambda函数中定义的错误,但如果我将其删除。它说do_A或do_B没有被定义。

编辑

我设法弄明白。我需要改变lambda表达式弄成这个样子:

lambda x, y: x.do_A(y) 

,我会这样称呼它:

self.do_stuff[each](self, each) 

这是一个可怕的想法?

回答

7

do_stuff在您的示例中不是实例变量。它更像是一个静态变量。您需要在一个方法中定义do_stuff(例如,init方法),其中您引用了self以便使其成为实例变量。我希望这个例子能够为你澄清一些事情:

class Foo: 

    def __init__(self): 
    self.do_stuff = { "A": self.do_A, "B": self.do_B } 

    def run(self): 
    for x in ["A", "B"]: 
     self.do_stuff[x]("hi") 

    def do_A(self, x): 
    pass 

    def do_B(self, x): 
    pass 

请注意,lambda函数不是必需的。你可以在你的字典中存储对函数本身的引用。符号“self.do_A”将自动作为第一个参数传递自我。

编辑:有谁知道如何使下划线在非代码示例文本中正确显示?
编辑:WTH?预览显示与帖子不同的下划线。

+0

+1:更简单。没有兰姆达斯。 – 2008-11-13 21:31:08