Seite 1 von 1

globale Instanz - wie kann ich

Verfasst: Donnerstag 1. Dezember 2005, 12:31
von Gast
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.

Re: globale Instanz - wie kann ich

Verfasst: Donnerstag 1. Dezember 2005, 13:24
von jens
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.

Verfasst: Donnerstag 1. Dezember 2005, 14:22
von Gast
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

Verfasst: Donnerstag 1. Dezember 2005, 14:28
von Joghurt
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/

Verfasst: Donnerstag 1. Dezember 2005, 14:29
von Gast
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

Verfasst: Donnerstag 1. Dezember 2005, 14:37
von Gast
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...

Verfasst: Donnerstag 1. Dezember 2005, 14:46
von jens
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

Verfasst: Donnerstag 1. Dezember 2005, 15:07
von Gast
hi jens!

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

MfG

Verfasst: Donnerstag 1. Dezember 2005, 15:09
von jens

Verfasst: Donnerstag 1. Dezember 2005, 22:56
von BlackJack
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.