2015-01-03 75 views
0

試圖實現在Python以下2.7.8地圖和SETATTR函數動態地設定對象屬性

class X: 
    pass 

a = X() 
b = X() 
t={1: {1: a, 2: b}} 

map(lambda x: setattr(x, 'test', 'wow'), t[1].values()) 

給出:[無,無],而我希望它設置屬性「測試」每到「哇」 如果我叫SETATTR(一,「測試」,「哇」)外圖的(),然後一切工作

+1

它_does_設置'test'屬性 「哇」。什麼不工作? –

+0

使用'map'有什麼意義?爲什麼不使用正常的循環? – ekhumoro

回答

3
class X: 
    pass 

a = X() 
b = X() 
t={1: {1: a, 2: b}} 

map(lambda x: setattr(x, 'test', 'wow'), t[1].values()) 

a.test # output is 'wow' 

它的行爲如預期。只要setattr返回None(所有不顯式返回值的函數實際上返回None)。所以,當你map它,它返回兩次Nonemap返回setattr返回的事情的清單:[None, None]map有它確實改變了屬性,這是你想要做什麼副作用,但是這不是什麼map回報。爲了證明該行爲更清楚:

response = setattr(a, 'test', 'wow2') 
print response #None 
print a.test #wow2 

爲什麼不這樣做:

for x in t[1].values(): 
    setattr(x, 'test', 'wow') 

代替。這完全不清楚你爲什麼需要map。你的困惑來自map返回一個列表的事實,但是你所要做的並不是獲取列表,而是對列表中的每個對象進行一些操作。