3

我该怎么做这样的事情:

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()

这导致它给出一个错误,即 self 没有在 lambda 函数中定义,但是如果我删除它。它说 do_A 或 do_B 没有定义。

编辑

我设法弄清楚了。我需要将 lambda 表达式更改为如下所示:

lambda x, y: x.do_A(y)

我会这样称呼它:

self.do_stuff[each](self, each)

这是一个可怕的想法吗?

4

1 回答 1

7

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

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”将自动将 self 作为第一个参数传递。

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

于 2008-11-13T18:56:32.683 回答