self.... als voreingestellter Methodenparameter?

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,

ich habe eine Klasse Daten(), die unter anderen eine Methode GetFilter() besitzt. Wenn diese Methode ohne Parameter aufgerufen wird, möchte ich, dass ein interner Zeiger mit dem Namen 'self.zeiger' als voreingestellter Parameter verwendet wird.

Fehlermeldung: NameError: name 'self' is not defined

Wo liegt mein Denkfehler?

Hier der gesamte Code:

Code: Alles auswählen

class Daten:
    def __init__(self):
        #Daten zum Testen:
        self.gesamt = [['03.05.2010', '08.00', '09.00', 'Fruhstuck'], ['03.05.2010', '10.00', '17.00', 'Geburtstagsparty'],
                       ['04.05.2010', '06.00', '18.00', 'Katerstimmng']]
        self.zeiger = 0
        self.ergebnis = []

    def SetFilter(self, filter):
        for i in range(len(self.gesamt)):
            if filter in self.gesamt[i]:
                self.ergebnis.append(self.gesamt[i])
        return len(self.ergebnis)

    def GetFilter(self, goto=self.zeiger):
       self.zeiger = goto            
        if goto < len(self.ergebnis):
            return self.ergebnis[goto]
Also mit anderen Worten: Wenn GetFilter() ohne Parameter aufgerufen wird, soll der Wert des letzten Aufrufs beibehalten werden. Wenn also goto den Wert 2 hatte, soll GetFilter() ohne Wertübergabe wieder mit goto = 2 arbeiten.

Liebe Grüße
mutetella
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Beim erzeugen der Methode ist self nicht bekannt. Du definierst ja selber, wie du die aktuelle Instanz nennst (self).
Um defaults zu verwalten würde ich dann sowas machen:

Code: Alles auswählen

def x(self, a=None):
    if a is None:
        a = self.a
Deinen Code habe ich mir jetzt nicht näher angeschaut.
[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]
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

self ist kein Name, an dem immer das aktuelle Objekt gebunden ist, sondern nur vorhanden, wenn es als erster Parameter der Methode übergeben wird.

Mach es so:

Code: Alles auswählen

def foo(self, goto=None):
    if goto is None:
        goto = self.zeiger
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Vielen Dank für die Antworten!!

Eure Lösungen funktionieren soweit. Trotzdem verstehe ich nicht, weshalb ich beim Aufruf der Methode nicht self.zeiger als default deklarieren kann. self.zeiger wird doch beim Instanziieren angelegt und ist somit für alle Methoden bekannt. Wenn ich die Instanz

a = Daten()

anlege, erhalte ich beim Aufruf a.zeiger den Wert 0, so wie in der __init__-Methode festgelegt. Weshalb ist dann self.zeiger beim Aufruf von a.GetFilter() nicht bekannt?

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

mutetella hat geschrieben:anlege, erhalte ich beim Aufruf a.zeiger den Wert 0, so wie in der __init__-Methode festgelegt. Weshalb ist dann self.zeiger beim Aufruf von a.GetFilter() nicht bekannt?
Weil die Zeile die die Funktion definiert (Zeile 15) ausgeführt wird, noch bevor die Klasse instanziiert wird. Daher ist noch nicht bekannt was ``self`` ist.
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:

Aber wenn ich

a.GetFilter()

aufrufe, ist doch a bereits eine Instanz der Klasse Daten(). Sonst lässt sich GetFilter() doch gar nicht aufrufen.

:?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

def a():
    print 'a'
    return 'a'

def b(a=a()):
    print 'b with', a
Interessanter wirds wenn du immutables benutzt:

Code: Alles auswählen

def add(k, v, d=dict()):
    d[k] = v
    return d

add('a',1)
print add('b', 2)
[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]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Vielleicht hilft auch das:

Code: Alles auswählen

class C:
    print 'definiere init'
    def __init__(self, a):
        print 'init'
        self.a = a
        print 'a ist', a
    
    print 'definiere method'
    def method(self, b):
        print 'method'
        print 'a,b',self.a,b
    
    print 'end'

print
print 'erzeuge Instanz'
c = C(2)

print
print 'Methode aufrufen'
c.method(2)
[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:

mutetella hat geschrieben:aufrufe, ist doch a bereits eine Instanz der Klasse Daten(). Sonst lässt sich GetFilter() doch gar nicht aufrufen.
Es geht nicht darum wann die Funktion aufgerufen wurde, sondern wann sie definiert wurde. Beispiel dafür:

Code: Alles auswählen

In [5]: def hallo():
   ...:     print "wurde definiert"
   ...: 
In [6]: class A(object):
   ...:     def foo(self, b=hallo()):
   ...:         print "wurde ausgeführt"
   ...: 
wurde definiert
Wie du siehst wurde hallo() aufgerufen noch bevor ich überhaupt A instanziiert habe.
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:

Ok, danke.... Knoten ist gelöst!
Antworten