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

Klassen + Datenaustausch (keine Frage zu global!)

Beitragvon Kelhim » Samstag 3. Januar 2009, 17:20

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:

Beitragvon Andyh » Samstag 3. Januar 2009, 17:37

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: Alles auswählen

import sys

if sys.platform == "win32":
    print "this program only runs on operating systems!!!"
    sys.TotalError()
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beitragvon str1442 » Samstag 3. Januar 2009, 17:41

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: 2404
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Samstag 3. Januar 2009, 17:42

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

Beitragvon tordmor » Samstag 3. Januar 2009, 19:06

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

Beitragvon Kelhim » Samstag 3. Januar 2009, 21:57

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!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder