getattr

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
klaus b

Ich habe ein Verstaendnisproblem mit dem cmd getattr.
Was gibt es mir fuer Werte zurueck und
in welchem Zusammenhang setzt man es ein.

Im voraus vielen Dank.

Klaus
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo claus,

getattr, ich denke Du meinst die Methode __getattr__, kann in Klassendefinitionen verwendet werden um den Zugriff auf Objektattribute einer Klasse quasi umzuleiten. Als Beispiel nimm z.B. einen 3D Vector der von (User)Array abgeleitet ist.

Code: Alles auswählen

class Vector3D(UserArray):
    def __init__(self, *args):
        UserArray.__init__(self,args,Float)

    def __getattr__(self,name):
        if name == "x": return self[0]
        elif name == "y": return self[1]
        elif name == "z": return self[2]
        else: UserArray.__getattr__(self, name)
Ohne die Methode __getattr__ können die Elemente von Vector3D Objekten nur über die Indizierung angesprochen werden.

Code: Alles auswählen

v = Vector(4.0,3.5,5.0)
prrint v[1]
3.5
schöner und besser lesbar ist es wenn die Elemente in der Form vector.x, vector.y und vector.z angesprochen werden können. Hier kommt getattr zum Einsatz.

Code: Alles auswählen

print v.y
3.5
Das Gegenstück, um auf solche Pseudoelemente schreiben zu können ist dann eben eine __setattr__ Methode

Code: Alles auswählen

    def __setattr__(self, name, value):
        if name == "x": self[0] = value
        elif name == "y": self[1] = value
        elif name == "z": self[2] = value
        else: UserArray.__setattr__(self, name, value)
jetzt kann mann auch v.x = 4.5 schreiben und trotzdem v als Array z.B. im Numeric.py verwenden.


Gruß

Dookie
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Nichts für ungut Dookie, ich versuchs mal einfacher :lol:

mit getattr() kannst du ermitteln, ob ein Attribut mit dem gesuchten Namen existiert. Es können drei Parameter übergeben werden, wovon die ersten beiden Pflicht sind:

* Object: das Objekt, in dem gesucht werden soll, z. B. self
* Name: der Name des gesuchten Attributes
* Defaultwert: Dieser Wert wird zurückgegeben, wenn das Objekt nicht existiert.

Ist der Dritte Parameter nicht angegeben, wird mit einer Fehlermeldung abgebrochen, wenn das Attribut nicht gefunden werden konnte. Im Erfolgsfall bekommst du dann das Attribut zurück.

Hat deine Klasse (self) als Beispiel ein Attribut Eingabefeld dann könnte das so aussehen.

Code: Alles auswählen

a=getattr(self, "Eingabefeld", None)
if a != none:
  a.setText('mach was')
Das wäre das gleiche als wenn du

Code: Alles auswählen

self.Eingabefeld.setText('mach was')
schreiben würdest. Ist in gewissen Situationen einfacher.

Ich hoffe das hilft dir weiter
Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi hans,

wieder was dazu gelernt, hab diese Funktion gar nicht gekannt, find sie aber auch etwas überflüssig.


Gruß

Dookie
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Hi Dookie

überflüssig ist die nicht. Du kannst einerseits Code vereinfachen.

Code: Alles auswählen

a=getattr(self.ganz.tief.unten, 'meinObject', None)
if a != None:
  a.setText(Macht nix)
  b = a.text()

#liest sich besser als
self.ganz.tief.unten.meinObject.setText(Macht nix)
b= self.ganz.tief.unten.meinObject.text()
Eine andere Variante ist z.B.: Du hast eine Config Datei mit ganz vielen werten zu ganz vielen Objekten. Wenn die Objektnamen aus den Bezeichnern der Konfigdatei abgeitet werden können, dann liest du halt alle Bezeichner ein, machst eine for - Schleife ermittelst mit getattr() das Attribut und weist dann die Werte aus der Config zu. Schau dir mal auf mener HP das NorPyTar an. Ich habe dadurch meinen Sourcecode um fast 50% verkleinern können.

Hans
Antworten