433 Stimmen

Wie kann ich ein Objekt erstellen und ihm Attribute hinzufügen?

Ich möchte ein dynamisches Objekt (innerhalb eines anderen Objekts) in Python erstellen und ihm dann Attribute hinzufügen.

Ich habe es versucht:

obj = someobject
obj.a = object()
setattr(obj.a, 'somefield', 'somevalue')

aber das hat nicht funktioniert.

Irgendwelche Ideen?

bearbeiten:

Ich setze die Attribute aus einer for Schleife, in der eine Liste von Werten durchlaufen wird, z. B.

params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()

for p in params:
   obj.a.p # where p comes from for loop variable

In dem obigen Beispiel würde ich Folgendes erhalten obj.a.attr1 , obj.a.attr2 , obj.a.attr3 .

Ich habe die setattr Funktion, weil ich nicht wusste, wie man die obj.a.NAME von einer for Schleife.

Wie würde ich das Attribut auf der Grundlage des Wertes von p im obigen Beispiel?

35voto

evilpie Punkte 2565

Es gibt mehrere Möglichkeiten, dieses Ziel zu erreichen. Grundsätzlich benötigen Sie ein Objekt, das erweiterbar ist.

obj.a = type('Test', (object,), {})  
obj.a.b = 'fun'  

obj.b = lambda:None

class Test:
  pass
obj.c = Test()

25voto

andreabedini Punkte 1265

Jetzt können Sie (nicht sicher, ob es die gleiche Antwort wie evilpie ist):

MyObject = type('MyObject', (object,), {})
obj = MyObject()
obj.value = 42

23voto

neldor Punkte 231

Probieren Sie den folgenden Code aus:

$ python
>>> class Container(object):
...     pass 
...
>>> x = Container()
>>> x.a = 10
>>> x.b = 20
>>> x.banana = 100
>>> x.a, x.b, x.banana
(10, 20, 100)
>>> dir(x)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__',     '__sizeof__', 
'__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'banana']

10voto

SilentGhost Punkte 285785

Comme Die Ärzte sagen :

Hinweis : object tut no haben eine __dict__ können Sie also nicht beliebige Attribute einer Instanz der object Klasse.

Sie könnten einfach eine Instanz der Dummy-Klasse verwenden.

4voto

Robpol86 Punkte 1525

Diese Lösungen sind bei der Prüfung sehr hilfreich. Aufbauend auf die Antworten aller anderen mache ich das in Python 2.7.9 (ohne staticmethod bekomme ich einen TypeError (unbound method...):

In [11]: auth = type('', (), {})
In [12]: auth.func = staticmethod(lambda i: i * 2)
In [13]: auth.func(2)
Out[13]: 4

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X