Wie setzen/erhalten Sie die Werte von Attributen von t
gegeben von x
?
class Test:
def __init__(self):
self.attr1 = 1
self.attr2 = 2
t = Test()
x = "attr1"
Nullpoet
Wie setzen/erhalten Sie die Werte von Attributen von t
gegeben von x
?
class Test:
def __init__(self):
self.attr1 = 1
self.attr2 = 2
t = Test()
x = "attr1"
Pratik Deoghare
Es werden eingebaute Funktionen aufgerufen getattr
und setattr
getattr(object, attrname)
setattr(object, attrname, value)
In diesem Fall
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Es gibt auch delattr zum Löschen von Attributen, aber das wird selten verwendet.
– David Kirby
10. April 2010 um 7:33 Uhr
und hasattr zum Testen, ob ein Objekt ein bestimmtes attr hat oder nicht, obwohl in diesem Fall die Verwendung der Form mit drei Argumenten getattr(object, attrname, default) oft besser ist.
– Duncan
10. April 2010 um 11:20 Uhr
gibt es trotzdem, wir können getattr so verwenden und sagen, ich habe einen Datenrahmen df1
und 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 nicht mit getattr oder anderen Methoden möglich ist.
– ihightower
1. Februar 2020 um 13:50 Uhr
du kannst tun getattr(globals()[x], 'shape')
– reich
27. Juli 2020 um 23:46 Uhr
@ilightower Siehe Wie erhalte ich den Wert einer Variablen, wenn ihr Name in einer Zeichenfolge angegeben ist? Kurz gesagt, es gibt keine allgemeine Möglichkeit, dies zu tun, wenn der Bereich unbekannt ist. Die Lösung von afult geht davon aus, dass es sich um eine globale handelt, obwohl dies wahrscheinlich der Fall ist.
– wjandrea
11. November 2021 um 20:07 Uhr
Wenn Sie die Logik in der Klasse versteckt halten möchten, ziehen Sie es vielleicht vor, eine verallgemeinerte Getter-Methode wie diese zu verwenden:
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 auflö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 tauschen getattr(self,varname)
durch return vars(self)[varname]
aber getattr
könnte gemäß der Antwort auf Was ist der Unterschied zwischen vorzuziehen sein vars
und setattr
?.
aatifh
new
Modul das war 2008 verworfen.Es gibt in Python eingebaute Funktionen setattr und getattr. Welches verwendet werden kann, um das Attribut einer Klasse festzulegen und abzurufen.
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