使用 map 和 setattr 函数动态设置对象属性

Dynamically set object attribute with map and setattr function

尝试在 Python 2.7.8

中实现以下目标
class X:
    pass

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

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

给出:[无,无],而我希望它将每个属性 'test' 设置为 'wow' 如果我在 map() 之外调用 setattr(a, 'test', 'wow') 那么一切正常

请查看我的答案底部以获得更好的方法。这是对您的示例中发生的事情的解释(但同样,还有更好的方法)。

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   
> wow

它的行为符合预期。只是 setattr returns None(所有未明确 return 值的函数实际上 return None)。因此,当您 map 它时,它 return 两次都是 None,并且 map return 是 setattr return编辑:[None, None]map 的副作用是它确实会更改属性,这正是您想要做的,但这不是 map return 所做的。为了更清楚地展示行为:

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

为什么不这样做:

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

相反。根本不清楚为什么需要 map。您的困惑来自 map return 是一个列表,但您试图做的不是获取列表,而是对列表中的每个对象执行一些操作。