Klasse beenden-Problem

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
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

ich häng mal wieder fest, und zwei Tage suchen und lesen haben nicht geholfen (wie ich aus einer Klasse eine andere beende gibt es hier einen Link zu einer komplett englischen Seite, wo ich leider nix verstanden habe)

da es mir nicht gelingt, aus einer Klasse heraus eine andere zu beenden, versuche ich nun in der einen Klasse eine globale Variable zu setzen und diese in der zweiten Klasse abzufragen damit sie sich wenn True selbst beendet:

Code: Alles auswählen

##		self.standby_timer.startLongTimer(variable)
#		startet class laufendes

	class laufendes(self)
		def standby_on(self):
			self.standby_timer.stop()
			if self.ScreenSaverTimer.isActive():
				self.ScreenSaverTimer.stop()
			self.session.openWithCallback(self.offtimer_reaktion, MessageBox, "herunterfahren abbrechen?",timeout=15)
		
		def offtimer_reaktion(self,answer):
			global offtimer
			if answer is False:
				#verschieden Anweisungen....
			else:
				global stb_start
				stb_start = True
				#weiteres....

	
	class ScreenSaver(Screen):
		def __init__(self, session, text):
			# bla bla
		def startRun(self):
			self.moveTimer.start(5000)

		def moveTimer_Timeout(self):
			global stb_start
			ert = stb_start
			if ert:
				self.close(self.session)
				#verschiedene weitere Anweisungen...
				#
ich hoffe, der Code-Auszug ist aussagekräftig und ihr könnt und wollt :) mir weiterhelfen
ich hab 'ne kastrierte Form von Python, meine Scripte müssen ohne Nachinstallationen auskommen..........
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Klassen kann man nicht beenden, weil man sie nicht starten kann. Was man machen kann ist Funktionen starten und beenden, meinst du das?

Der Code-Auszug ist relativ fürchterlich (``class laufendes(self)`` ist sogar auf mehrere Arten völlig falsch) und die globals lassen einen erschaudern. Was für eine Funktion läuft denn in deinem Code in einer Dauerschleife? Aus welcher Funktion willst du sie beenden?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

in der zweiten Klasse läuft ein screensaver (also ein screen mit wechselnden bzw. ge'movten' angezeigten Texten, bei Ablauf des Timer also Verschiebung/Änderung des Textes

in der ersten Klassen wird ein Standby-Timer gestartet, welcher nach Ablauf diverses ausführt und einen importierten styndby-screen ausführt.

mein Problem dabei ist, das ich zwar in der ersten Klasse prüfen kann, ob im standby, dann beenden. Jedoch bleibt der screensaver aktiv so das ich beim Einschalten per Powertaste den Screensaver immer noch am laufen habe

(ich kann mir vorstellen, das es für 'nen Profi bissl hart ist, mein Gewurschtl anzusehen. Ich mach das aber nur nebenbei um mir selbst nicht vorhandenes zu ermöglichen - deshalb besonderer Dank für die Trotzdem-Hilfe anstelle von bäh und bah! Ideal wärs halt, wenn ich jemanden hätte der mein gesamtes Geschreibsel mal mit mir durchgeht und es mir anhand der Fehler beibringt, aber leider fehlt allen die Zeit so wie mir auch)
ich hab 'ne kastrierte Form von Python, meine Scripte müssen ohne Nachinstallationen auskommen..........
BlackJack

@shadow07: Dein eigentliches Problem habe ich leider nicht verstanden, daher gibt's nur oberflächliche Anmerkungen zum vorhandenen Quelltextschnippsel.

Warum ist der Block eingerückt? ``class``-Anweisungen befinden sich üblicherweise auf Modulebene, selten in Blöcken von bedingten Verzweigungen, noch seltener innerhalb von Funktionen, und fast nie innerhalb von anderen ``class``-Anweisungen. Da Python nicht so etwas wie innere Klassen kennt, wie zum Beispiel bei Java, macht letzteres auch nicht viel Sinn.

Klassennamen schreibt man per Konvention gross und von `self` erben macht keinen Sinn. An was ist das denn an der Stelle gebunden? `laufendes` ist ein schlechter Namen. *Was* läuft denn da?

Schmeiss alle ``global``\s aus dem Programm.

Vergleiche mit ``is`` nur machen, wenn man wirklich auf Objektidentität testen möchte. `False` ist (noch) kein Singleton, der Vergleich kann also ein unerwünschtes Ergebnis haben. Ausserdem braucht man bei `True` und `False` in der Regel gar keine Vergleiche mit `True`/`False` bei Bedingungen, denn die Bedingung selber wird ja zu einem Wahrheitswert ausgewertet. In Zeile 13 wäre dass also ein ``if not answer:``.
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

Warum ist der Block eingerückt?
ist beim rauskopieren passiert
Klassennamen schreibt man per Konvention gross
wird umgehend geändert
`self`
die Sache mit self habe ich überhaupt noch nicht kapiert, da schaue ich einfach ab und übernehme was woanders steht (ohne zu wissen warum), solange ich keinen Fehler gemeldet bekomme....
Schmeiss alle ``global``\s aus dem Programm
witzich, habe ja überall gelesen das global's 'böse' sind - für'n Profi sicher kein Problem, aber die habe ich dann drin wenn ich partout meine Variablen nicht dahin bekomme, wo ich sie brauche
`if not answer:
gilt das auch wenn nein und gar nicht gedrückt gleiche Aktion zur Folge haben sollen, nur ja gedrückt eben anderes?
ich hab 'ne kastrierte Form von Python, meine Scripte müssen ohne Nachinstallationen auskommen..........
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

shadow07 hat geschrieben:die Sache mit self habe ich überhaupt noch nicht kapiert, da schaue ich einfach ab und übernehme was woanders steht (ohne zu wissen warum), solange ich keinen Fehler gemeldet bekomme....
Code blind übernehmen, ist eine sehr schlechte Idee. Auch wenn ich verstehen kann, dass man anfangs bei ganz neuen Sachen dazu neigt.

Wenn du keine bestimmte Klasse hast, von der du erben willst, solltest du von `object` erben (also das in Klammern hinter den Klassennamen schreiben).

`self` hingegen wird per Konvention als erstes Argument in den Klassenmethoden genutzt, da es die Instanz der Klasse repräsentiert. Keine Sorge, mit der Zeit verstehst du noch, was das bedeutet. ;)
witzich, habe ja überall gelesen das global's 'böse' sind - für'n Profi sicher kein Problem, aber die habe ich dann drin wenn ich partout meine Variablen nicht dahin bekomme, wo ich sie brauche
Das macht man über Klassenattribute in Verbindung mit dem Konstruktor (`__init__()`).
gilt das auch wenn nein und gar nicht gedrückt gleiche Aktion zur Folge haben sollen, nur ja gedrückt eben anderes?
`not` reagiert auf False, None, leeren String, leere Liste, leeren Tupel, leeres Dictionary, und 0.
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

if not answer:
kapiert, korrigiert
Dein eigentliches Problem habe ich leider nicht verstanden
also nochmal anders:
in Klasse 'laufendes' (Name ist bereits geändert) wird eine externes Python-Prog aufgerufen.
Danach soll sich mein gesamtes prog beenden. Es wird jedoch nur die Klasse 'laufendes' beendet, Klasse 'ScreenSaver' läuft weiter
ich hab 'ne kastrierte Form von Python, meine Scripte müssen ohne Nachinstallationen auskommen..........
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Eine Klasse *läuft* nicht, sie existiert. Wenn, dann laufen ihre Methoden aber das hat auch schon Leonidas gesagt ...

Wenn du dein Programm beenden willst: ``import sys; sys.exit()``

Daneben empfehle ich http://docs.python.org/tutorial/classes.html zur Lektüre.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Da Python nicht so etwas wie innere Klassen kennt, wie zum Beispiel bei Java, macht letzteres auch nicht viel Sinn.
Es würde eher sagen, es macht genauso viel Sinn wie staticmethod(): Zum Gruppieren von Dingen, welche beieinander gehören. Nutze ich eine bestimmte Klasse nur intern, in einer anderen, um Dinge zu intern zu vereinfachen und macht es absolut keinen Sinn, dieses Klasse außerhalb zur Verfügung zu stellen? Oder wirkt diese Klasse ohne ihre Elternklasse zwanghaft aus dem Konzept entfernt? In beiden Fällen würde ich die Klasse in die Klassendefinition schreiben und im ersten Fall einen Unterstrich davorsetzen. Habe ich vor kurzem auch so getan.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

snafu hat geschrieben:`self` hingegen wird per Konvention als erstes Argument in den Klassenmethoden genutzt, da es die Instanz der Klasse repräsentiert. Keine Sorge, mit der Zeit verstehst du noch, was das bedeutet. ;)
Diese würde ich eher "Instanzmethoden" nennen, oder sowas in der Richtung, aber nicht "Klassenmethoden". Klassenmethoden sind für mich Methoden, die sich auf die Klasse beziehen, also solche, die mit "classmethod" dekoriert wurden und per Konvention `cls` als erstes Argument nehmen.
Das macht man über Klassenattribute in Verbindung mit dem Konstruktor (`__init__()`).
Hier würde ich auch eher "Instanzattribut" sagen.

Was meint ihr?

Gruß,

Fred
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ja, da hast du recht, aber eventuell wird das auch etwas zu fein ;)

Klassenattribute sind uebrigens die, die ihm Klassennamensraum deklariert werden - genau genommen auch die Klassenfunktionen, die dann eben bei Instanzerzeugung zu Methoden umgebaut werden.
Da ich grad dabei bin: ``__new__`` ist IMHO durchaus eine Klassenmethode - ``__init__`` aber nicht - da hier erst die Instanz generiert wird. Normalerweise verwendet man hier auch ``cls``.

Aber wie gesagt: Das kann man fast schon als Korinthenkackerei bezeichnen - zumindest in Verbindung mit dem urspruenglichen Verstaendnisproblem vielleicht sogar schaedlich, weil das sich zu sehr mit der Nomenklatur beschaeftigt ;)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

@cofi: Und wenn wir dann schon beim Korinthenkacken sind: wenn man mit "Klassenmethode" dann auch tatsächlich `classmethod()` in Python meint, kann `__new__()` keine Klassenmethode sein, sondern nur eine statische Methode, da bei Klassenmethoden die Klasse implizit übergeben wird, folglich man niemals eine andere Klasse übergeben kann (Beispiel).
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
lunar

@str1442
Wenn die Klasse nicht unbedingt als Attribut einer anderen Klasse existieren muss, ist es unsinnig, sie an die Klasse zu binden. Schließlich "verschwindet" sie dadurch ja nicht, sondern ist immer noch als "Klasse.InnereKlasse" zu erreichen. Ob das nun besser "gruppiert" ist, sei mal dahingestellt. Schließlich bildet das umschließende Modul bereits eine gute Gruppierung.


@fred.reichbier
Ich würde vor allem "Exemplar" sagen ;)
Antworten