Methoden-Attribute... Gibt es sowas überhaupt?

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

eigentlich war ich der Meinung, dass ich das Thema mehr oder weniger im Griff hätte... Dem scheint wohl nicht so :cry:

Code: Alles auswählen

class Test():
    def __init__(self):
        self.a = 10

    def guck(self):
        b = 10
Wenn ich eine Instanz der Klasse Test() erstelle, erhalte ich über instanz.a den Wert des Attributs self.a, also 10.
Wenn ich dann die Methode guck() über instanz.guck() aufrufe und das Attribut b über instanz.guck.b abfragen möchte, erhalte ich die Meldung

AttributeError: 'NoneType' object has no attribute 'b'

Schon klar, über die return-Anweisung wär's kein Problem. Ich möchte allerdings nach Aufruf einer bestimmten Methode mehrere Attribute belegen, die ich dann bequem über instanz.methode.attribut abfragen kann.

Wo liegt mein Denkfehler?

Liebe Grüße
mutetella
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

`b` ist ein lokaler Name, der existiert nur in `guck` und von außen kannst du da nicht darauf zugreifen.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mutetella hat geschrieben:Ich möchte allerdings nach Aufruf einer bestimmten Methode mehrere Attribute belegen, die ich dann bequem über instanz.methode.attribut abfragen kann.
Wenn schon instanz.attribut! Um den Tipp von trundle ein wenig greifbarer zu machen: Denk mal über 'self' nach.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Trundle hat geschrieben:`b` ist ein lokaler Name, der existiert nur in `guck` und von außen kannst du da nicht darauf zugreifen.
Und das ist sogar unabhängig von Klassen:

Code: Alles auswählen

def guck():
    b = 10
Da kannst du auch nicht auf ``guck.b`` zugreifen, weil das eben nur lokal existiert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Trundle:
Soweit schon klar... Ich dachte eben an eine Möglichkeit, auf den lokalen Namen 'b' von außen zugreifen zu können.

@Hyperion:
Natürlich ist b sichtbar, wenn ich in der Methode 'guck' aus b = 10 ein self.b = 10 mache. Aber damit mache ich b ja zu einem Attribut der Klasse, ich wollte eben ein Attribut haben, das weiterhin nur in der Methode existiert und trotzdem von außen sichtbar ist, darum instanz.methode.attribut.
Nun ja, aber das ist ja wohl so nicht möglich.

Danke für Eure Hilfe!

mutetella
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mutetella hat geschrieben:Ich dachte eben an eine Möglichkeit, auf den lokalen Namen 'b' von außen zugreifen zu können.
Wozu will man sowas machen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@mutetella: Ich würde mich der Frage von Leonidas anschliessen -- warum will man so etwas?

Auf lokale Namen kann man nicht nur nicht zugreifen weil sie nicht nach aussen sichtbar gemacht werden, sondern in den meisten Fällen, weil sie nur solange existieren wie die Funktion aktiv ausgeführt wird. Und Funktionen können auch zu einem beliebigen Zeitpunkt mehr als einmal aktiv sein -- welches `b` würdest Du denn dann haben wollen!?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Wozu will man sowas machen?
Hmm... es gab' einmal einen wirklich guten Grund, aber den weiß ich jetzt nicht mehr :D

Ok, ihr habt natürlich Recht... das ist totaler Quatsch und ergibt keinen Sinn... manchmal denke ich, eine wirklich geniale Idee zu verfolgen und verliere dabei mein Unsinngefühl...

Danke, ihr habt mir sehr geholfen!

mutetella
Antworten