动态实例属性

时间:2012-10-09 18:59:20

标签: 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}

有没有办法动态创建和属性,每个属性都是dict键,因此inst.a会返回1等等。

5 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:2)

使用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
>>> 

答案 2 :(得分:1)

这个解决方案比pythonm提供的解决方案更加古怪:

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

不使用inst.d,而是直接使用inst.__dict__。另外一个好处是添加到d的新密钥会自动成为属性。这是动态的。

答案 3 :(得分:0)

你可以这样做:

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)

答案 4 :(得分:0)

您也可以使用__getattr__

class Foo(object):

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

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