2008-11-13 85 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