一次设置多个对象属性

时间:2015-05-13 10:37:12

标签: python variables attributes

有没有办法在一行上设置同一对象的多个属性,类似于为多个变量赋值的方式?

如果我可以写

a,b,c=1,2,3

我想要像

这样的东西
someObject.(a,b,c)=1,2,3

具有相同的效果
someObject.a=1
someObject.b=2
someObject.c=3

4 个答案:

答案 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())