[Python-de] Namespaces, Klassen u. Objekte...??

python-lists at duerer-sinclair.de python-lists at duerer-sinclair.de
Mon Apr 28 12:18:57 EDT 2003


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






More information about the Python-de mailing list