2013-08-15 2 views
2

Как обновить переменную класса из словаря? Я придумал грязный хак, но я ищу (если есть) для чего-то более аккуратного.Обновление переменной класса python на основе словаря

Предположим, что мне нужен класс C, параметры которого будут заданы на основе данного словаря. В результате c должен иметь

class C: 
    def setVar(self, var): 
     for key in var.keys(): 
      exec('self.{} = {}'.format(key, var[key])) 

D = {'a':1, 'b':2, 'c':3} 
c = C() 
c.setVar(D) 

# c.a = 1 
# c.b = 2 
# c.c = 3 
+0

Я знаю, что вы не просите, но на всякий случай вы не знаете, вы можете использовать метод '__init__' для установки начальных значений этих переменных (класс будет создан как' c = C (** D) ') –

+0

@PauloAlmeida: Передача' ** D' на '__init__' не будет автоматически ничего делать; вам нужно написать метод '__init__', который выполняет в основном то же самое, что и' setVar' (за исключением принятия '** kwargs' вместо' var' и циклизации над 'kwargs' вместо' var'). – abarnert

+0

@abarnert, я знаю, я просто хотел убедиться, что он знает об этой возможности. Я не думал о цикле через '** kwargs', я бы предложил установить каждую переменную в словаре явно. Как я уже сказал, я знаю, что это был не вопрос, просто подумал, что это полезная информация, если он не знает. –

ответ

6

Это именно то, что setattr для:

def setVar(self, var): 
    for key, value in var.items(): 
     setattr(self, key, value) 

В более общем плане, практически в любое время вы окажетесь глядя на eval или exec, искать рефлексивную функцию, как setattr первые, и вы будете почти всегда находят.


Если вы знаете, что ваш класс использует простой __dict__ для экземпляра атрибутов, и все эти атрибуты экземпляра (это стандартный случай, и если вы не знаете, что все это значит, что это верно для ваш код), вы можете сделать это быстро & грязный хак:

def setVar(self, var): 
    self.__dict__.update(var) 

Однако setattr работы в любом случае, имеет смысл, и не должным образом в большинстве случаев это не так, и, конечно, это говорит именно то, что это do-it устанавливает атрибут на self с именем key - value, однако этот атрибут сохранен - ​​делает его намного чище.

0

Как насчет этого?

def setVar(self, var): 
    for key, value in var.iteritems(): 
     setattr(self, key, value) 
Смежные вопросы