globale Instanz - wie kann ich

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
Gast

Donnerstag 1. Dezember 2005, 12:31

Hi alle Pythonianer!
Ich habe ein BIG Problem:

WUNSCH:
Ich habe eine globale Instanz, oder wollte ich so verwenden, damit immer als Parameter übergeben.
CODE:
base.py

Code: Alles auswählen

class GlobalClass:

	def testWas(self, element):
		print "Element: ", element
base2.py

Code: Alles auswählen

from base import *

class ClassTest:
	global gKlasse
	def testGlobal(self, txt):
		global gKlasse
		gKlasse.testWas(txt)
	
if __name__ == '__main__':

	gKlasse = GlobalClass()
	print "Das ist direkt aufgerufen!"
	ct = ClassTest()
	ct.testGlobal("dirkt als Main aufgerufen")
else:
	pass
#	gKlasse = GlobalClass()


test.py

Code: Alles auswählen

from base2 import *

gKlasse  = GlobalClass()

def testGlobalAgain():
	ct = ClassTest()
	ct.testGlobal("Das kommt von testGlobalAgain")
	gKlasse.testWas("aus der Funktion testGlobal")
	
if __name__ == '__main__':
	testGlobalAgain()
Fehlermeldung: bei test.py
NameError: global name 'gKlasse' is not defined

================================
wie kann ich nur bei test.py eine Instanz erstellen, und die wird bei
der zu importierenden Module verwendet?
mit global klappt es nicht!
mit if -- else in base2.py funktioniert, wenn die Zeile unkommentiert, aber
das ist nicht meine Vorstellung, da die Instanz vom Caller/Importer abhängig erzeugt werden soll!
================================

Vielen Dank für Tips oder Hinweis!

Boostpy

Edit (Leonidas): Code in Python-Tags gesetzt.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 1. Dezember 2005, 13:24

Erstens, sollte man "from bla import *" und global generell vermeiden. Zweitens benutzte lieber 4-Leerzeichen statt Tabulatoren zum einrücken.

So sollte es gehen (ungetestet):
base.py

Code: Alles auswählen

class GlobalClass:
	def testWas(self, element):
		print "Element: ", element
base2.py

Code: Alles auswählen

import base

class ClassTest:
    def __init__(self):
        self.gKlasse = base.gKlasse()
    def testGlobal(self, txt):
        self.gKlasse.testWas(txt)

if __name__ == '__main__':
    base.gKlasse().testWas("Das ist direkt aufgerufen!")
    ct = ClassTest()
    ct.testGlobal("dirkt als Main aufgerufen")
else:
    gKlasse = base.GlobalClass()
    gKlasse.testWas("__name__ ist: %s" % __name__)
Schau dir mal das an: http://www.pythonwiki.de/ModulImporte

Edit (Leonidas): Code in Python-Tags gesetzt.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Donnerstag 1. Dezember 2005, 14:22

Hi jens,

Danke!

Zu deinem Vorschlag: deine Anpassung funktioniert, aber ich will nicht immer self.* eintippen. Wenn nicht geht, dann MUSS ich die Instanz als Schlüsselparameter angeben.

Zum Leerzeichen statt Tab als Indent/Einrücken: Es ist gut auf alle Fällen, aber ich weiß nicht, wie man auf einen Schlag vier Leerzeichen schreiben :lol:

Zum Import: Ja, import statt from ist viel eindeutiger, aber wenn ich die zu importierenden Klassen erweiteren, dann alle anderen abändern, oder immer base.derived.sub.... so schreiben.
ICH schaue mal dein Link an, vielleicht bekomme ich einen Kompromiss.

Ich brauche weitere Tips!

MfG
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 1. Dezember 2005, 14:28

Wenn du so schreibfaul ist, ist Python wohl nicht das optimale. Du kannst immer noch perl nehmen, aber dafür kann man den Code später auch nicht mehr lesen ;)
(Du kannst den ersten Parameter auch "s" statt "self" nennen, dann musst du nur noch "s." schreiben, die Lesbarkeit leidet aber erheblich darunter)

Vergleich mal deinen und jens' Code. Jens' Code ist schneller zu verstehen, bei deinem muss man erst nachdenken, was du da genau machst, wozu das global benötigt wird, etc.

Und betreffs der Leerzeichen, ein guter Pythoneditor rückt mehr oder weniger automatisch ein:

http://www.stani.be/python/spe/blog/
Gast

Donnerstag 1. Dezember 2005, 14:29

Hallo jens,

ich habe gerade bemerkt, dass du die Zeilen unter else .... von if __name__ ... else__ aus der base2.py aktiviert. Ich wollte nicht aktivieren, sonst funktioniert der Code ohne Änderung (ich wollte die Instanz durch das importierende Script erstellen)

MfG
Gast

Donnerstag 1. Dezember 2005, 14:37

Hi Joghurt,

Ich kenne nur C, kein Perl :D

Ich wollte doch allgemeine Python-Regeln gehalten, deswegen benutze ich auch self als Objekt selbst, nicht nur 's'

Die genannten globalen Variablen sind nur auf zwei/drei begrenzt! Das ist nicht prima als OO, aber...
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 1. Dezember 2005, 14:46

Anonymous hat geschrieben:aber ich will nicht immer self.* eintippen.
Naja, so wird es aber gemacht... Deswegen global zu benutzten ist völlig daneben... Wie gesagt, global immer vermeiden!
Es muß auch nicht jedes Objekt mit self. klassenweit verfügbar gemacht werden. Halt nur die, bei denen es sich lohnt. Ansonsten kannst du Objekte einfach an Methoden übergeben und zurück liefern lassen...
Anonymous hat geschrieben:Zum Leerzeichen statt Tab als Indent/Einrücken: Es ist gut auf alle Fällen,
Jep, wird allgemein so gemacht... Du solltest dir einen Editor schnappen, den man so einstellen kann, das er statt TABs automatisch 4-Leerzeichen macht...
Ich verwende SciTE: http://www.pythonwiki.de/PythonDeForum/ ... ba93a62497

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Donnerstag 1. Dezember 2005, 15:07

hi jens!

ich benutze SciTE, mit dem man den Indent/Einrücken einstellen kann.

MfG
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 1. Dezember 2005, 15:09


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Donnerstag 1. Dezember 2005, 22:56

Ich verstehe nicht so ganz was diese GlobalClass überhaupt machen soll. Das sieht alles etwas wirr aus. Kannst Du mal beschreiben *was* Du erreichen möchtest, und nicht *wie* Du das gerade versuchst. Vielleicht können wir Dir dann einen einfacheren Weg zeigen.
Antworten