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

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

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}

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

 nneonneo09 окт. 2012 г., 21:01
Да, но ты быне сможет их использовать, потому чтоinst.0 это недопустимый синтаксис.
 user39576009 окт. 2012 г., 21:04
Да, но зачем вам это делать вместо доступа к элементам по индексу, либо прямо из списка, либо путем переопределения__getitem__ и друзья.
 root09 окт. 2012 г., 21:09
@ Делнан - этоЭто всего лишь пример, не очень практичное решение, я просто хотел бы узнать, как динамически создавать атрибуты.
 root09 окт. 2012 г., 21:07
@ nneonneo - отредактировал вопрос.

Ответы на вопрос(5)

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)
 Krumelur09 окт. 2012 г., 21:17
Хотя это будет работать,setattr это правильный путь.

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

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)

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

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

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

class Foo(object):

    def __init__(self, d):
        self.d = d

    def __getattr__(self, name):
        return self.d[name]
Решение Вопроса

использовать: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)
>>> l.d
{'a': 1, 'b': 2}
>>> l.a
1
>>> l.b
2
>>> 
 Ashwini Chaudhary09 окт. 2012 г., 21:16
@ корень да, просто переместите цикл внутри__init__(). смотри отредактированное решение.

Ваш ответ на вопрос