Seite 1 von 1

Kann Thread keine Variablen übergeben

Verfasst: Donnerstag 18. August 2005, 10:45
von hehejo
Warum bekomme ich diesen Fehler?
Ich gebe meinem Thread doch die Variable mit?!

Code: Alles auswählen

>>> from threading import Thread, Event
>>> class t(Thread):
            def __init__(self, event):
               super(Thread) # nützt auch nichts
               self.event = event
            def run(self):
               self.event.wait(15)
               print 'ich darf'

>>> e = Event()
>>> a = t(e)
>>> a.start()

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in -toplevel-
    a.start()
AssertionError: Thread.__init__() not called
>>> 

Verfasst: Donnerstag 18. August 2005, 11:08
von jens
So sollte es gehen:

Code: Alles auswählen

>>> from threading import Thread, Event
>>> class t(Thread):
            def __init__(self, event):
               self.event = event
               Thread.__init__(self)
            def run(self):
               self.event.wait(15)
               print 'ich darf'

>>> e = Event()
>>> a = t(e)
>>> a.start() 

Verfasst: Donnerstag 18. August 2005, 11:35
von hehejo
vielen Dank.

Hab grad in der Hilfe nachgelesen, was super wirklich macht.
Aber den Sinn des Beispieles verstehe ich wirklich nicht:

Code: Alles auswählen

class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)

super()

Verfasst: Donnerstag 18. August 2005, 12:23
von henning
Ich auch nicht so richtig, darum verwende ich es grundsätzlich nicht.
Ich find die Grundidee von super() zwar klasse,
aber in der momentanen Umsetzung trägt es (wie dieses Beispiel gut zeigt) sehr viel mehr zur Verwirrung bei als dass es etwas nützt.

Verfasst: Donnerstag 18. August 2005, 12:30
von hehejo
Ich hab ja noch nicht mal so ganz verstanden wozu das gut ist.

Verfasst: Donnerstag 18. August 2005, 12:54
von henning
Ganz sicher bin ich auch nicht...
<rate_funktion_von_super>
aber ich glaube dass super dir eine Instanz
von deiner Vater-Klasse zurückgibt, die sich dann aber irgendwie mit
der Insanz deiner Klasse überschneidet.

Also in deinem Beispiel halt ein Objekt der Klasse B, so dass
das .meth(arg) halt wirklich meth aus B aufruft, aber sich das natürlich trotzdem noch auf dein Objekt bezieht, sonst würde das Ganze ja keinen Sinn machen. (Deswegen muss man wohl auch self übergeben)
</rate_funktion_von_super>

Was ich noch in Erinnerung behalten habe war, dass super wohl irgendwie nur Sinn macht, wenn alle Parent-Klassen das auch verwenden, aber wenn sie das tun, dann MUSST du super nutzen.
Irgendwo im Netz gabs da nen schönen Text zu.
Die Schlußfolgerung war aber so ungefähr, das super()direkt aus der Hölle kommt und davon bin ich inzwischen auch überzeugt. ,-)

edit:
Habs gefunden: http://fuhm.org/super-harmful/

Verfasst: Donnerstag 18. August 2005, 13:24
von hehejo
Vielen Dank.

Zitat von der Seite:
you must remember that super does not call your superclass
Das sollte ich mir mal aufschreiben.

Verfasst: Donnerstag 18. August 2005, 13:45
von henning
Ui mir fällt gerade auf, dass meine Liebligssprache Dylan da sogar erwähnt wird :-)