attribut aus String erstellen und self[name]

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
elchgesicht
User
Beiträge: 2
Registriert: Dienstag 24. November 2009, 23:14

Ich bin über zwei Sachen gestolpert, die ich gerne verstehen möchte als Anfänger:

In einer Klasse A, wird über eine Funktion ein String übergeben, nachdem die Funktion durchgelaufen ist (da werden noch 100 andere Objekte verwendet), ist ein Attribut mit dem Namen des Strings verfügbar, der Code ist ellenlang.

Code: Alles auswählen

obj = A('hallo')
obj.hallo
Wie macht man sowas?

Zum anderen wird dabei der Ausdruck

Code: Alles auswählen

self[xy]
verwendet. Kann mir jemand sagen, was das bedeutet?

Vielen Dank
elch

PS, warum wir der code hier nur so merkwürdig angezeigt?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Schau dir mal __setattr__ und __getitem__ an.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

elchgesicht hat geschrieben:PS, warum wir der code hier nur so merkwürdig angezeigt?
Wenn du BBCode in deinem Posting deaktivierst, dann geht BBCode nicht mehr.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
elchgesicht
User
Beiträge: 2
Registriert: Dienstag 24. November 2009, 23:14

jetzt hab ichs!

Kurze generelle Frage. Ich habe festgestellt, dass Pythoncode sehr verschieden ist. Manche Programmierer verwenden ununterbrochen buildin Functions um Dinge zu machen, die man sonst zwar auch erreichen kann, aber vielleicht nur über Vererbung und besseres Klassendesign. Z.B. meine ich das hinzufügen von Attributen aus einer anderen Klasse oder Funktion heraus. Oft macht das den Code ziemlich unübersichtlich.
Frage: Ist das jetzt eher die Königsklasse der Pythonprogrammierung oder einfach nur schlechter Stil?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Wenn du mit "Hinzufügen von Attributen aus einer anderen Funktion heraus" Monkey-Patching meinst: Ich halte es für ziemlich schlechten Stil. Einige sind davon sehr begeistert, beschwören vor allem auch, wie toll man damit testen könne. Ich habe mir gerade beim Testen mit Monkey-Patching schon ziemlich heftig in den Fuß geschossen, so daß ich es jetzt generell ablehne.

Was das Überschreiben von "magischen" Methoden (Die Dinger mit den vier Unterstrichen) betrifft: Das ist gängige Praxis, von der Sprache her so vorgesehen und ich würde es auch als eher guten Stil betrachten. Kommt n bisschen darauf an, *wie* du die Methoden überschreibst. Irgendwo sollte der ursprüngliche Verwendungszweck natürlich erhalten bleiben. :lol:
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das erste Beispiel erreicht man auch mit folgenden drei Varianten, die alle ohne `__setattr__` auskommen:

Code: Alles auswählen

class A(object):
    def __init__(self, name):
        self.__dict__[name] = "X"

class A(object):
    def __init__(self, name):
        setattr(self, name, "X")

class A(object):
    def __init__(self, name):
        self.values = {name: "X"}
    
    def __getattr__(self, name):
        return self.values[name]
Ellenlang muss da nichts sein.

Stefan
Antworten