Seite 2 von 2

Re: Tornado Klasse importieren und starten

Verfasst: Sonntag 17. Januar 2016, 13:00
von tenor
Danke!

Vernutlich bedeutet das, dass starten so wie ich es gemacht habe, keine Funktion ist, oder sein sollte.

Bleibt die Frage wie es richtig gemacht werden muss.
Einen Handler per Funktion zu starten und zu stoppen sollte ja möglich sein.

Re: Tornado Klasse importieren und starten

Verfasst: Sonntag 17. Januar 2016, 13:01
von BlackJack
@tenor: Zu Deinem Problem *wurde* alles gesagt, Du setzt es bloss nicht um. Und anscheinend gefällt Dir das gesagte nicht, denn es läuft darauf hinaus, dass Du Dein aktuelles Problem erst einmal zurückstellen müsstest um sowohl Python- als auch OOP-Grundlagen zu lernen. Weil Dein momentanes Vorgehen — programmieren durch wildes herumraten und unter falschen Annahmen, und ignorieren von *deutlichen* Hinweisen — nicht funktioniert. Jetzt haben Dir schon zwei Leute die sich mit Python und OOP auskennen gesagt, dass es nicht an Dir ist ein Exemplar von `WSHandler` zu erstellen. Und Du versuchst es trotzdem…

Du bis nicht weiter als vorher, jedenfalls nicht wenn man die Nähe zum Ziel als Massstab nimmt. Das sehen wir sehr deutlich. Welchen Fortschritt auch immer Du siehst, der ist nicht da. Nur die Zeit ist vorangeschritten.

Auch `WSHandler` ist durch ableiten erweiterbar. Man kann auch an jede normale Wand ein Schnitzel nageln. Es macht halt nicht unbedingt Sinn.

Wenn Du verstanden hast das man das in eine Funktion schreiben kann, dann musst Du jetzt nur noch in einem Python-Grundlagen-Tutorial lernen wie man in Python Funktionen definiert und das dann auch mal *tun*.

Ein Handler behandelt hier eine eingehende Verbindung. Für jede Verbindung wird von Tornado ein Exemplar erstellt. Von Tornado! NICHT VON DIR! Und damit Tornado das tun kann muss dessen Schleife bereits laufen bevor das passiert. Du erstellst keine Handler. Das macht Tornado. Es ist nicht vorgesehen das Du ein Exemplar vom Handler erstellst. Die Handler*klasse* wird Tornado übergeben damit Tornado dann später, wenn tatsächlich Verbindungen von aussen aufgebaut werden, Exemplare vom Handler für diese Verbunden erstellt werden können. Habe ich schon erwähnt das Du keine Exemplare vom Handler erstellen sollst?

Ableiten und Aufrufen sind verschiedene Dinge. In `first.py` leitest Du nicht vom `WebSocketHandler` ab. Die beiden Begriffe sind Grundlagen. Lerne die. Warte nicht das hier jemand irgendwo ein Tutorial für Dich abschreibt damit Du es hier lesen kannst, statt an dem ursprünglichen Ort wo es veröffentlich wurde. Die Zeit wird sich sehr wahrscheinlich niemand nehmen, weil das relativ sinnfrei ist.

Du musst keine Klassen instanziieren um Funktionen zu nutzen. Funktionen in Klassen („statische Methoden“) sind relativ selten weil sie in der Regel ein „code smell“ sind. Wenn man so etwas schreibt, braucht man einen guten Grund dafür.

Die “Methode“ `starten()` hätte nichts mit dem `WSHandler` zu tun, sie benutzt nichts von diesem Objekt, sie verändert das Objekt nicht, sie gibt keine Information von diesem Objekt an den Aufrufer zurück und man kann auch nicht sagen das sie einen Handler startet, denn der wird erst benötigt wenn der Tornado-Server läuft und tatsächlich eine Websocket-Verbindung von aussen kommt. Also potentiell viel später.

Falls der Kurs es wirklich auf „Methoden sind nur Funktionen die in Klassen definiert werden“ verkürzt, dann solltest Du Dich nach einer anderen Quelle umsehen.

Die richtige Definition, siehen auch den vorletzten Absatz, trifft auf `starten()` nicht zu.

Dir fehlt Wissen zu Modulen/Namensräumen, Funktionen, Klassen, Methoden, grösseren Zusammenhängen wie Entwurfsmuster, und dem Tornado-Rahmenwerk. Das erlangst Du nicht durch ein funktionierendes Beispiel, was in diesem Fall wirklich supereinfach geschrieben wäre, weil Du daraus nicht ersehen wirst was die ganzen Begrifflichkeiten, von denen Du offenbar teilweise falsche Vorstellungen hast, tatsächlich bedeuten. Du wirst beim nächsten Problem wieder ratlos davor stehen und wieder nach einem kleinen Beispiel fragen/betteln. Und wenn Dir das dann jemand schreibt, wieder nicht wirklich etwas daraus lernen. Programmieren besteht nicht aus Beispielen zusammenkopieren und raten was man ändern müsste damit es irgendwie läuft.

Die supereinfache Lösung wurde schon genannt, wie gesagt, eigentlich wurde bereits alles wichtige gesagt: Schreib eine Funktion. Solange Du nicht in der Lage und Willens bist eigenständig zu lernen wie man in Python Funktionen definiert, kann man Dir nicht wirklich beim lernen und verstehen helfen.