Python 动态实例属性

Python 动态实例属性,python,class,attributes,Python,Class,Attributes,假设我有一门课: 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,依此类推 class Foo(object): def __init__(self, attributes): self

假设我有一门课:

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
,依此类推

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)
使用
setattr()


这里有一个比pythonm提供的解决方案更奇怪的解决方案:

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

不要使用
inst.d
,直接使用
inst.\uu dict\uu
。另一个好处是,添加到
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)

您还可以使用
\uuuu getattr\uuuu

class Foo(object):

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

    def __getattr__(self, name):
        return self.d[name]

是的,但是您不能使用它们,因为
inst.0
是非法语法。是的,但是为什么您要这样做,而不是直接从列表中通过索引访问项目,或者通过重写来访问项目。@nneonneo--编辑了这个问题。@delnan--这只是一个示例,不是一个非常实用的解决方案,我只想学习如何动态创建属性。@root是的,只需将for循环移动到
\uuuu init\uuuu()
中即可。请参阅已编辑的解决方案。
class Foo(object):

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

    def __getattr__(self, name):
        return self.d[name]