2015-01-03 33 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返回一个列表的事实,但是你所要做的并不是获取列表,而是对列表中的每个对象进行一些操作。