Динамические атрибуты экземпляра

Скажем, у меня есть класс:

class Foo(object): def __init__(self,d): self.d=d d={'a':1,'b':2} inst=Foo(d) inst.d Out[315]: {'a': 1, 'b': 2} 

Есть ли способ создать dyamically n атрибутов, где каждый атрибут будет ключом dict, поэтому inst.a вернет 1 и так далее.

5 Solutions collect form web for “Динамические атрибуты экземпляра”

используйте setattr() :

 >>> class foo(object): def __init__(self, d): self.d = d for x in self.d: setattr(self, x, self.d[x]) >>> d = {'a': 1, 'b': 2} >>> l = foo(d) >>> ld {'a': 1, 'b': 2} >>> la 1 >>> lb 2 >>> 
 class Foo(object): def __init__(self, attributes): self.__dict__.update(attributes) 

Это сделало бы это.

 >>>foo = Foo({'a': 42, 'b': 999}) >>>foo.a 42 >>>foo.b 999 

Вы также можете использовать встроенный метод setattr :

 class Foo(object): def __init__(self, attributes): for attr, value in attributes.iteritems(): setattr(self, attr, value) 

Вот решение, еще более необычное, чем предложение pythonm:

 class Foo(object): def __init__(self, d): self.__dict__ = d 

Вместо использования inst.d используйте inst.__dict__ напрямую. Дополнительным преимуществом является то, что новые ключи, добавленные в d автоматически становятся атрибутами. Это так же динамично, как и получается.

Вы могли бы сделать что-то вроде этого:

 class Foo(object): def __init__(self, **kwdargs): self.__dict__.update(kwdargs) d = {'a':1,'b':2} foo = Foo(**d) foo2 = Foo(a=1, b=2) 

Вы также можете использовать __getattr__ .

 class Foo(object): def __init__(self, d): self.d = d def __getattr__(self, name): return self.d[name] 
Python - лучший язык программирования в мире.