variable - python object attributes




Wie kann ich ein Objekt erstellen und Attribute hinzufügen? (10)

Ich möchte ein dynamisches Objekt (in einem anderen Objekt) in Python erstellen und 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, die eine Liste von Werten durchläuft, z

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

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

Im obigen Beispiel würde ich obj.a.attr1 , obj.a.attr2 , obj.a.attr3 .

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

Wie würde ich das Attribut basierend auf dem Wert von p im obigen Beispiel festlegen?


Anders sehe ich, so:

import maya.cmds

def getData(objets=None, attrs=None):
    di = {}
    for obj in objets:
        name = str(obj)
        di[name]=[]
        for at in attrs:
            di[name].append(cmds.getAttr(name+'.'+at)[0])
    return di

acns=cmds.ls('L_vest_*_',type='aimConstraint')
attrs=['offset','aimVector','upVector','worldUpVector']

getData(acns,attrs)

Das mock Modul ist grundsätzlich dafür gemacht.

import mock
obj = mock.Mock()
obj.a = 5

Diese Lösungen sind sehr hilfreich beim Testen. Aufbauend auf den Antworten aller anderen mache ich dies in Python 2.7.9 (ohne staticmethod bekomme ich einen TypeError (ungebundene Methode ...):

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


Es ist alles in der docs .

TLDR: Sie müssen die return_value Eigenschaft des return_value , der Rest ist 'Magic'.

Beispiel:

SomeConstructor = MagicMock()

SomeConstructor.return_value. \
    some_class_method.assert_called_once_with('cool!')

  SomeConstructor.return_value. \
        some_inner_property. \
        some_inner_method.assert_called_once_with('super cool!')

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

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

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']

Sie können ein Klassenobjekt auch direkt verwenden. Es erstellt einen Namespace:

class a: pass
a.somefield1 = 'somevalue1'
setattrib(a, 'somefield2', 'somevalue2')

Welche Objekte benutzt du? Ich habe es mit einer Beispielklasse versucht und es hat gut funktioniert:

class MyClass:
  i = 123456
  def f(self):
    return "hello world"

b = MyClass()
b.c = MyClass()
setattr(b.c, 'test', 123)
b.c.test

Und ich bekam 123 als Antwort.

Die einzige Situation, in der ich diesen setattr sehe, ist, wenn Sie einen setattr für ein eingebautes Objekt versuchen.

Update: Aus dem Kommentar ist dies eine Wiederholung von: Warum können Sie keine Attribute zum Objekt in Python hinzufügen?


wie die Ärzte sagen :

Hinweis : Das object hat kein __dict__ , sodass Sie keiner Instanz der object beliebige Attribute zuweisen können.

Sie könnten einfach eine Dummy-Klasseninstanz verwenden.





attributes