2015-05-13 4 views
2

Есть ли способ установить несколько атрибутов одного и того же объекта в одной строке, аналогично тому, как присваивать значения нескольким переменным?Установка нескольких атрибутов объектов сразу

Если я могу написать

a,b,c=1,2,3 

Я хотел бы иметь что-то вроде

someObject.(a,b,c)=1,2,3 

Имея тот же эффект, как

someObject.a=1 
someObject.b=2 
someObject.c=3 

ответ

1
attributes = ['a', 'b', 'c'] 
values = [1, 2, 3] 
for attr, val in zip(attributes, values): 
    setattr(obj, attr, val) 
+0

Да, это работает, но не более изящные и ни более читаемый, чем версия три строки выше. Я хотел бы узнать, есть ли у Python синтаксический сахар, который может упростить настройку атрибута. –

1

Прежде всего вы можете сделать то же самое с атрибутами объекта, как и с другими вариантами es:

someObject.a, someObject.b, someObject.c = 1,2,3 

Не уверен, что это уже то, что вы имеете в виду. Если вы хотите обновить произвольные атрибуты (например, в функции), то вы можете использовать тот факт, что объекты Python хранить свои атрибуты в Словаре, который поддерживает update() метода:

someObject.__dict__.update({"a":1, "b":2, "c":3}) 

Однако, это должно быть сделано только с забота! Если вы предложите это в функции, любой атрибут someObject может быть изменен с помощью этой функции, и даже новые атрибуты могут быть вставлены!

4
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__ - это «скрытый» атрибут, деталь реализации, который вы не должны использовать, если вы действительно не хотите каким-то образом изменить реализацию.

0

Вот Pythonic путь:

attrs = {'a': 1, 'b': 2, 'c': 3} 

map(lambda item: setattr(someObject, *item), attrs.iteritems()) 
Смежные вопросы