Zugriff auf Objektattribute mit einer Zeichenfolge, die dem Namen dieses Attributs entspricht

153

Wie setzen / erhalten Sie die Werte von Attributen von tgegeben durch x?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"
Nullpoet
quelle

Antworten:

284

Es gibt integrierte Funktionen namens getattrundsetattr

getattr(object, attrname)
setattr(object, attrname, value)

In diesem Fall

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Pratik Deoghare
quelle
12
Es gibt auch delattr zum Löschen von Attributen, dies wird jedoch selten verwendet.
Dave Kirby
11
und hasattr zum Testen, ob ein Objekt ein bestimmtes attr hat oder nicht, obwohl in diesem Fall die Verwendung der Drei-Argument-Form getattr (Objekt, attrname, Standard) oft besser ist.
Duncan
Gibt es sowieso können wir getattr wie dieses verwenden und sagen, ich habe einen Datenrahmen df1und eine Variable, x = 'df1'dh df1 als String in var x. Ich möchte die Form von df so drucken, getattr(x, 'shape')oder getattr('df1', 'shape'). Ich weiß, dass dies mit getattr und anderen Methoden nicht möglich ist.
ihightower
3

Hinweis: Diese Antwort ist sehr veraltet. Dies gilt für Python 2 mit dem newModul, das 2008 veraltet war .

In den Funktionen setattr und getattr ist Python integriert. Womit das Attribut einer Klasse festgelegt und abgerufen werden kann.

Ein kurzes Beispiel:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20
aatifh
quelle
0

Wenn Sie die Logik in der Klasse verbergen möchten, bevorzugen Sie möglicherweise eine verallgemeinerte Getter-Methode wie die folgende:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

Ausgänge:

Attribute value of attr1 is 1

Ein anderer Ansatz, der es noch besser verbergen könnte, wäre die Verwendung der magischen Methode __getattribute__, aber ich bekam immer wieder eine Endlosschleife, die ich nicht lösen konnte, als ich versuchte, den Attributwert innerhalb dieser Methode abzurufen.

Beachten Sie auch, dass Sie alternativ verwenden können vars(). Im obigen Beispiel könnten Sie getattr(self,varname)durch tauschen return vars(self)[varname], sind aber getattrmöglicherweise entsprechend der Antwort auf Was ist der Unterschied zwischen varsund setattr? .

not2savvy
quelle