Angenommen, ich habe eine Klasse:

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}

Gibt es eine Möglichkeit, n Attribute dynamisch zu erstellen, wobei jedes Attribut ein Diktatschlüssel wäre, sodass inst.a 1 zurückgeben würde und so weiter.

2
root 9 Okt. 2012 im 22:59

5 Antworten

Beste Antwort

Benutze 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
phant0m 17 Okt. 2012 im 10:43
class Foo(object):
    def __init__(self, attributes):
        self.__dict__.update(attributes)

Das würde es tun.

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

Sie können auch die integrierte Methode setattr verwenden:

class Foo(object):
    def __init__(self, attributes):
        for attr, value in attributes.iteritems():
            setattr(self, attr, value)
3
lolopop 9 Okt. 2012 im 19:14

Sie können auch __getattr__ verwenden.

class Foo(object):

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

    def __getattr__(self, name):
        return self.d[name]
0
Niklas R 9 Okt. 2012 im 20:57

Hier ist eine Lösung, die noch ausgefallener ist als die von Python:

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

Verwenden Sie anstelle von inst.d direkt inst.__dict__. Ein zusätzlicher Vorteil ist, dass neue Schlüssel, die zu d hinzugefügt werden, automatisch zu Attributen werden. Das ist so dynamisch wie es nur geht.

1
user4815162342 9 Okt. 2012 im 19:35

Sie könnten so etwas tun:

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)
0
martineau 9 Okt. 2012 im 20:53