Hallo!
Derzeit bastele ich an einem Programm, in dem eine große Zahl von Klassen auf einen großen, gemeinsamen Satz von Objekten innerhalb dieses Moduls zugreifen muss.
Das global-Statement meide ich hier natürlich wie der Teufel das Weihwasser.
Mir ist auch bewusst, dass ich einen ähnlichen Effekt erziele, wenn ich diese Objekte in einer Klasse definiere (diese also als Container benutze) und sie zum Parent der anderen Klassen mache. Der Nachteil dieser Methode ist leider, dass Veränderungen an einem der Objekte dann nur innerhalb einer Klasseninstanz gelten, die anderen Instanzen aber weiterhin mit den ursprünglich im Parent definierten Objekten arbeiten.
Jede Veränderung an den Objekten soll aber auch anderen Klassen zur Verfügung stehen.
Mir bleibt also nur, die Objekte (oder die Klasse, in der ich sie zusammenfasse) als Argument von Funktion zu Funktion zu übergeben und zurückgeben zu lassen?
Seh ich das richtig? ^^
Klassen + Datenaustausch (keine Frage zu global!)
Hallo
So gehts:
Oder so würde ich das machen, ist jetzt nicht gerade das musterbeispiel, aber ich wollte mal der erste sein.
Gruß
Andyh
So gehts:
Code: Alles auswählen
class c():
def __init__(self, a):
self.a = a
def get_zahl(self):
print self.a.zahl
class b():
def __init__(self, a):
self.a = a
def get_zahl(self):
print self.a.zahl
class a():
def __init__(self):
self.zahl = 123
self.b = b(self)
self.c = c(self)
self.get_zahl()
self.b.get_zahl()
self.c.get_zahl()
self.zahl += 100 #also 223
self.get_zahl()
self.b.get_zahl()
self.c.get_zahl()
def get_zahl(self):
print self.zahl
a()
Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys
if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys
if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Bitte nochmal. Die Klassen greifen auf die Objekte zu? Also instanzierst du Objekte und deine Klassen stellen dann (zur "Compiletime") irgendwas mit den Objekten an (zb Klassenvariable mit so einem Objekt anlegen)? Und damit alle Objekte allen (Sub)Klassen zur Verfügung stehen, könntest du eine gemeinsame Superklasse definieren die diese Objekte als Klassenvariablen enthält? Sowas ist meist keine gute Idee, wäre die Superklasse doch nur ein konstruierter Namespace.
Wenn es Objekte sind, die wirklich nur einmal instanziert werden, ist eine globale Konstante dafür vielleicht nicht schlecht. Global braucht man übringens nur, wenn man eine solche auch verändern will (und genau das sollte man nie tun), nicht für den Zugriff. Allerdings will ich mich auch nicht darauf festlegen, da mir deine Problemformulierung doch etwas zu diffus ist, um konkreteres sagen zu können. Achja, was für Funktionen eigentlich? Oder meinst du Methoden der Klasseninstanzen? Und die Klasse, die du gen Ende erwähnst, hätte die irgendeinen konkreten Nutzen als *Objekt* und nicht als Namespace? Oder wie? ^_^
Wenn es Objekte sind, die wirklich nur einmal instanziert werden, ist eine globale Konstante dafür vielleicht nicht schlecht. Global braucht man übringens nur, wenn man eine solche auch verändern will (und genau das sollte man nie tun), nicht für den Zugriff. Allerdings will ich mich auch nicht darauf festlegen, da mir deine Problemformulierung doch etwas zu diffus ist, um konkreteres sagen zu können. Achja, was für Funktionen eigentlich? Oder meinst du Methoden der Klasseninstanzen? Und die Klasse, die du gen Ende erwähnst, hätte die irgendeinen konkreten Nutzen als *Objekt* und nicht als Namespace? Oder wie? ^_^
Zunächst einmal sollte man überprüfen, warum denn die große Zahl von Klassen auf einen gemeinsamen Satz von Objekten zugreifen muss. Hier könnte sich nämlich schon der erste Designfehler verstecken. Sind es denn tatsächlich die Klassen, die auf die Objekte zugreifen, oder ist gemeint, die Instanzen der Klassen greifen darauf zu?
Die zweite Frage wäre dann, was gegen das global Statement spricht. So "natürlich" finde ich es gar nicht, das zu meiden (vorausgesetzt, die Programmieraufgabe soll tatsächlich durch den gemeinsamen Zugriff gelöst werden).
Die zweite Frage wäre dann, was gegen das global Statement spricht. So "natürlich" finde ich es gar nicht, das zu meiden (vorausgesetzt, die Programmieraufgabe soll tatsächlich durch den gemeinsamen Zugriff gelöst werden).