有没有办法在一行上设置同一对象的多个属性,类似于为多个变量赋值的方式?
如果我可以写
a,b,c=1,2,3
我想要像
这样的东西someObject.(a,b,c)=1,2,3
与
具有相同的效果someObject.a=1
someObject.b=2
someObject.c=3
答案 0 :(得分:7)
def setattrs(_self, **kwargs):
for k,v in kwargs.items():
setattr(_self, k, v)
使用此功能:
setattrs(obj,
a = 1,
b = 2,
#...
)
您也可以在类上定义此函数,但这种函数不太通用(即仅适用于该类实例)。
另一个答案提及__dict__.update
并且可以重写以删除引号:obj.__dict__.update(a=1, b=2)
,但是我不建议使用此方法:它不适用于属性并且可能很难请注意,如果从简单属性迁移到属性。基本上,__dict__
是“隐藏”属性,实现细节,除非你真的想以某种方式改变实现,否则你不应该使用它。
答案 1 :(得分:2)
首先,您可以对对象属性执行与其他变量相同的操作:
someObject.a, someObject.b, someObject.c = 1,2,3
不确定这是否已经是您的想法。如果你想更新任意属性(例如在函数中),那么你可以利用Python对象将它们的属性存储在dict中这一事实,它支持update()方法:
someObject.__dict__.update({"a":1, "b":2, "c":3})
然而,这应该只是小心谨慎!如果有人在函数中提供这个函数,那么可以使用该函数更改someObject的任何属性,甚至可以插入新属性!
答案 2 :(得分:1)
attributes = ['a', 'b', 'c']
values = [1, 2, 3]
for attr, val in zip(attributes, values):
setattr(obj, attr, val)
答案 3 :(得分:1)
这是一种Pythonic方式:
attrs = {'a': 1, 'b': 2, 'c': 3}
map(lambda item: setattr(someObject, *item), attrs.iteritems())