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
getattr
-
- 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.
Ohne die Methode __getattr__ können die Elemente von Vector3D Objekten nur über die Indizierung angesprochen werden.
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.
Das Gegenstück, um auf solche Pseudoelemente schreiben zu können ist dann eben eine __setattr__ Methode
jetzt kann mann auch v.x = 4.5 schreiben und trotzdem v als Array z.B. im Numeric.py verwenden.
Gruß
Dookie
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)
Code: Alles auswählen
v = Vector(4.0,3.5,5.0)
prrint v[1]
3.5
Code: Alles auswählen
print v.y
3.5
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)
Gruß
Dookie
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
Nichts für ungut Dookie, ich versuchs mal einfacher
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.
Das wäre das gleiche als wenn du schreiben würdest. Ist in gewissen Situationen einfacher.
Ich hoffe das hilft dir weiter
Hans
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')
Code: Alles auswählen
self.Eingabefeld.setText('mach was')
Ich hoffe das hilft dir weiter
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.
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
ü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()
Hans