Namespaces, Klassen u. Objekte...??
Hallo Liste, ich beiß mir schon seit paar Stunden die Zähne an folgendem Problem aus: Ich habe zwei Klassen: LinearModel und DataSet. LinearModel existiert im Modul rinterface.py, DataSet im Modul xdata.py. So, jetzt will ich in einem Programm ein DataSet Objekt erzeugen, sagen wir "ds = DataSet(...)" Irgendwann später (ds existiert noch) will ich ein LinearModel erzeugen, und zwar enthält dieses ein Attribut vom Typ DataSet - also z.B. "lm = LinearModel(ds)". Jetzt will ich dem DataSet bekannt machen, dass es zu _dem_ LinearModel gehört, das ich damit erzeugt habe. Sprich, LinearModel.__init__ sieht etwa so aus: def __init__(self, dset): if not (isinstance(dset, xdata.DataSet)): raise ValueError, "dset must be a DataSet" ... self.DataSet = dset self.DataSet.setLinearModel(self) ... in rinterface.py mache ich natürlich ein "import xdata" am Anfang Entsprechend enthält DataSet eine methode setLinearModel(), die etwa so aussieht: def setLinearModel(self, lm): if isinstance(lm, rinterface.LinearModel): self.LModel = lm else: raise AttributeError, "lm must be a LinearModel" In xdata.py mach ich ein "import rinterface" am Anfang. Jetzt hab ich folgendes kleine Script: from xdata import DataSet from rinterface import LinearModel ds = DataSet(..) print ds.__class__ # xdata.DataSet lm = LinearModel(ds) In dem Moment, wo lm erzeugt wird, kommt der ValueError, den ich "raise", wenn das Argument für LinearModel.__init__() kein DataSet Objekt ist (raise ValueError, "dset must be a DataSet"). Aber ds ist ein DataSet... und DataSet ist ansonsten im Programm auch bekannt... Was läuft hier schief, kann mir jemand helfen? Hab schon alles mögliche angestellt und jede Menge über Namespaces Klassen usw. in Python nachgelesen - ohne Erfolg :-/ Dankbar für jeden Tipp... Ecky ;) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Eckhard Lehmann wrote:
Hallo Liste,
ich beiß mir schon seit paar Stunden die Zähne an folgendem Problem aus:
Ich habe zwei Klassen: LinearModel und DataSet. LinearModel existiert im Modul rinterface.py, DataSet im Modul xdata.py.
Kannst du realen Code schicken (am besten zusammengekürzt), der das Problem produziert? holger _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Sun, 27 Apr 2003, Eckhard Lehmann wrote:
ich beiß mir schon seit paar Stunden die Zähne an folgendem Problem aus:
Ich habe zwei Klassen: LinearModel und DataSet. LinearModel existiert im Modul rinterface.py, DataSet im Modul xdata.py. [...] def __init__(self, dset): if not (isinstance(dset, xdata.DataSet)): raise ValueError, "dset must be a DataSet" ... self.DataSet = dset self.DataSet.setLinearModel(self) ...
in rinterface.py mache ich natürlich ein "import xdata" am Anfang Entsprechend enthält DataSet eine methode setLinearModel(), die etwa so aussieht:
def setLinearModel(self, lm): if isinstance(lm, rinterface.LinearModel): self.LModel = lm else: raise AttributeError, "lm must be a LinearModel"
[...] Obwohl ich nicht ganz sicher bin, was genau passiert, denke ich dass da zwei Dinge ungluecklich sind: a) Dein "Kreuzimport" (a macht import b und b macht import a) ist unschoen und fuehrt wahrscheinlich zu Deinen Problemen (reine Vermutung) b) Dein explizites Testen auf korrekte Klasse is un-Python-isch. Warum rufts Du nicht einfach die passende Methode auf und behandlest dann ggf. die Exception, falls das Objekt nicht das korrekte Interface definiert? In Python gilt normalerweise "Operation ausfuehren und Ausnahmen behandlen statt erst zu schauen bevor man springt" (praegnant als "es ist einfacher um Vergebung als um Erlaubnis zu fragen" ausgedrueckt). Was, wenn jemand Deinen Kode nimmt und ein anderes/besseres lineares Modell oder DataSet definiert? Dann funktioniert Dein Kode nicht, da Du nur die eigenen Klassen erlaubst... Wenn Du doch unbedingt auf korrektes Interface testen wills, schlage ich vor, die Interfaces als eigene Klassen (von denen Deine Implementationen dann erben) in einem separaten File zu definieren. Beide File machen dann ein Import von diesem Interface-def File statt sich gegenseitig zu importieren. (Und Dein Interface-Test fragt dann natuerlich auf diese abstrakte Interfaceklasse ab statt auf die konkrete Implementation.) Holger _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
Eckhard Lehmann
-
holger krekel
-
python-lists@duerer-sinclair.de