Dynamic instance attributes

2020-03-26 11:58发布

Say i have a class:

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}

Is there a way to dyamically create n attributes where each attribute would be a dict key, so inst.a would return 1 and so on.

5条回答
劫难
2楼-- · 2020-03-26 12:29

You could do something like this:

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)
查看更多
我欲成王,谁敢阻挡
3楼-- · 2020-03-26 12:32

Here is a solution even more outlandish than the one offered by pythonm:

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

Instead of using inst.d, use inst.__dict__ directly. An added benefit is that new keys added to d automatically become attributes. That's as dynamic as it gets.

查看更多
虎瘦雄心在
4楼-- · 2020-03-26 12:46

use 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
>>> 
查看更多
爷、活的狠高调
5楼-- · 2020-03-26 12:52
class Foo(object):
    def __init__(self, attributes):
        self.__dict__.update(attributes)

That would do it.

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

You can also use the setattr built-in method:

class Foo(object):
    def __init__(self, attributes):
        for attr, value in attributes.iteritems():
            setattr(self, attr, value)
查看更多
来,给爷笑一个
6楼-- · 2020-03-26 12:56

You can also use __getattr__.

class Foo(object):

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

    def __getattr__(self, name):
        return self.d[name]
查看更多
登录 后发表回答