Wie man auf ein Objektattribut zugreift (erhält oder setzt) ​​eine gegebene Zeichenfolge, die dem Namen dieses Attributs entspricht

Lesezeit: 2 Minuten

Benutzeravatar von Nullpoet
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"

Benutzeravatar von Pratik Deoghare
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 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 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 getattrkönnte gemäß der Antwort auf Was ist der Unterschied zwischen vorzuziehen sein vars und setattr?.

Benutzeravatar von aatifh
aatifh

Hinweis: Diese Antwort ist sehr veraltet. Es gilt für Python 2 mit der 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

1436320cookie-checkWie man auf ein Objektattribut zugreift (erhält oder setzt) ​​eine gegebene Zeichenfolge, die dem Namen dieses Attributs entspricht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy