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

これにより、セルフがラムダ関数で定義されていないというエラーが発生しますが、それを削除すると。do_A または do_B が定義されていません。

編集

私はそれを理解することができました。ラムダ式を次のように変更する必要があります。

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

ラムダ関数は必要ないことに注意してください。関数自体への参照を辞書に保存するだけです。「self.do_A」という表記は、最初の引数として自動的にselfを渡します。

編集:コードサンプル以外のテキストでアンダースコアを正しく表示する方法を知っている人はいますか?
編集:WTH?プレビューでは、投稿とは異なるアンダースコアが表示されます。

于 2008-11-13T18:56:32.683 に答える