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"

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)

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

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? .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.