类内的字典和lambda?

3 投票
1 回答
937 浏览
提问于 2025-04-11 20:23

我想知道怎么做类似这样的事情:

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函数中self没有定义,但如果我把它去掉,就会说do_A或do_B没有定义。

编辑

我终于搞明白了。我需要把lambda表达式改成这样:

lambda x, y: x.do_A(y)

然后我会这样调用它:

self.do_stuff[each](self, each)

这样做是不是个糟糕的主意?

1 个回答

7

在你的例子中,do_stuff 不是一个实例变量。它更像是一个静态变量。你需要在一个方法里(比如 init 方法)定义 do_stuff,这样你才能把它变成一个实例变量,因为那时你可以用到 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" 这样的写法会自动把 self 作为第一个参数传进去。

编辑:有没有人知道怎么让下划线在非代码文本中正确显示?
编辑:什么情况?预览中下划线的显示和发布的内容不一样。

撰写回答