使用 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 是一个列表,但您试图做的不是获取列表,而是对列表中的每个对象执行一些操作。
尝试在 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 是一个列表,但您试图做的不是获取列表,而是对列表中的每个对象执行一些操作。