Antworten:
Es gibt integrierte Funktionen namens getattr
undsetattr
getattr(object, attrname)
setattr(object, attrname, value)
In diesem Fall
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
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 mit getattr und anderen Methoden nicht möglich ist.
new
Modul, 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
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 getattr
möglicherweise entsprechend der Antwort auf Was ist der Unterschied zwischen vars
und setattr
? .