一次设置多个对象属性

Csa*_*ncz 6 python variables attributes

有没有办法在一行中设置同一对象的多个属性,类似于将值分配给多个变量的方式?

如果我能写

a,b,c=1,2,3
Run Code Online (Sandbox Code Playgroud)

我想有类似的东西

someObject.(a,b,c)=1,2,3
Run Code Online (Sandbox Code Playgroud)

具有相同的效果

someObject.a=1
someObject.b=2
someObject.c=3
Run Code Online (Sandbox Code Playgroud)

小智 9

def setattrs(_self, **kwargs):
    for k,v in kwargs.items():
        setattr(_self, k, v)
Run Code Online (Sandbox Code Playgroud)

像这样使用这个函数:

setattrs(obj,
    a = 1,
    b = 2,
    #...
)
Run Code Online (Sandbox Code Playgroud)

您也可以在类上定义此函数,但这不太通用(即仅应用于该类实例).

另一个答案提到__dict__.update并且可以重写以删除引号:obj.__dict__.update(a=1, b=2)但是我不建议使用此方法:它不适用于属性,如果从简单属性迁移到属性,可能很难注意到.基本上,__dict__是"隐藏"属性,实现细节,除非你真的想以某种方式改变实现,否则你不应该使用它.


小智 6

首先,您可以对对象属性执行与其他变量相同的操作:

someObject.a, someObject.b, someObject.c = 1,2,3
Run Code Online (Sandbox Code Playgroud)

不确定这是否是您的想法。如果你想更新任意属性(例如在函数中),那么你可以利用 Python 对象将其属性存储在字典中的事实,该字典支持 update ()方法:

someObject.__dict__.update({"a":1, "b":2, "c":3})
Run Code Online (Sandbox Code Playgroud)

然而,这只能小心地进行!如果有人在函数中提供此功能,则可以使用该函数更改 someObject 的任何属性,甚至可以插入新属性!


Łuk*_*ski 1

attributes = ['a', 'b', 'c']
values = [1, 2, 3]
for attr, val in zip(attributes, values):
    setattr(obj, attr, val)
Run Code Online (Sandbox Code Playgroud)