Python - Как установить сразу несколько атрибутов объекта? [Дубликат]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

Теперь добавим немного завихрения, введя небольшую задержку в нашей функции, чтобы все строки кода не выполнялись последовательно. Таким образом, он будет эмулировать асинхронное поведение функции:

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

4
задан Csaba Koncz 13 May 2015 в 11:35
поделиться

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

4
ответ дан caryoscelus 28 August 2018 в 01:24
поделиться

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

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

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

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

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

1
ответ дан jpoeppel 28 August 2018 в 01:24
поделиться

Вот питоновский путь:

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

map(lambda item: setattr(someObject, *item), attrs.iteritems())
1
ответ дан Shane 28 August 2018 в 01:24
поделиться
attributes = ['a', 'b', 'c']
values = [1, 2, 3]
for attr, val in zip(attributes, values):
    setattr(obj, attr, val)
1
ответ дан Łukasz Rogalski 28 August 2018 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: