Seite 1 von 1

self.... als voreingestellter Methodenparameter?

Verfasst: Mittwoch 3. Februar 2010, 11:51
von mutetella
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

Verfasst: Mittwoch 3. Februar 2010, 12:00
von jbs
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.

Verfasst: Mittwoch 3. Februar 2010, 12:02
von Panke
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

Verfasst: Mittwoch 3. Februar 2010, 15:19
von mutetella
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

Verfasst: Mittwoch 3. Februar 2010, 15:31
von Leonidas
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.

Verfasst: Mittwoch 3. Februar 2010, 15:36
von mutetella
Aber wenn ich

a.GetFilter()

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

:?

Verfasst: Mittwoch 3. Februar 2010, 15:45
von jbs

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)

Verfasst: Mittwoch 3. Februar 2010, 15:49
von jbs
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)

Verfasst: Mittwoch 3. Februar 2010, 15:51
von Leonidas
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.

Verfasst: Mittwoch 3. Februar 2010, 16:09
von mutetella
Ok, danke.... Knoten ist gelöst!