Klassen + Datenaustausch (keine Frage zu global!)

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
Kelhim
User
Beiträge: 16
Registriert: Donnerstag 17. Mai 2007, 13:18
Wohnort: Köln

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? ^^
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

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()
Oder so würde ich das machen, ist jetzt nicht gerade das musterbeispiel, aber ich wollte mal der erste sein.

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]
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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? ^_^
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Variante mit dem Container in Kombination mit Singleton/Borg Pattern wäre eine Möglichkeit.
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

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).
Kelhim
User
Beiträge: 16
Registriert: Donnerstag 17. Mai 2007, 13:18
Wohnort: Köln

Danke für die Antworten bisher!

@Andyh: Danke, an so etwas hatte ich nicht gedacht. Einfach, aber das scheint genau das zu sein, wonach ich gesucht habe!
Antworten