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

Dmi*_*nov 2 python dictionary python-2.7

尝试在 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())
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*oel 5

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

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
Run Code Online (Sandbox Code Playgroud)

它的行为符合预期。只是setattr返回None(所有没有显式返回值的函数实际上都返回None)。因此map,当您执行此操作时,它会返回None两次,并map返回返回的内容的列表setattr[None, None]map它的副作用是它确实改变了属性,这正是您想要做的,但这不是map返回的结果。为了更清楚地展示行为:

response = setattr(a, 'test', 'wow2')
print response  
> None
print a.test  
> wow2
Run Code Online (Sandbox Code Playgroud)

为什么不这样做:

for x in t[1].values():
    setattr(x, 'test', 'wow')
Run Code Online (Sandbox Code Playgroud)

反而。根本不清楚为什么你需要map. 您的困惑来自于返回列表的事实map,但您想要做的不是获取列表,而是对列表中的每个对象进行一些操作。