
Guten Abend, in Python 2.4 ist es möglich von eingebauten Objekten zu erben, unteranderen auch von der Klasse set() (nicht sets.Set!). Ich habe jetzt von der Klasse Set folgende neue Klasse Newset abgeleitet: class Newset(set): def __init__(self,): set.__init__(self,) self.liste =3D [] def update(self, seg): set.update(self,seg) for i in seg: if not i in self.liste: self.liste.append(i) Erzeuge ich jetzt zwei Objekte a und b und fühle sie mit a.update(range(5)) bzw. b.update(range(3)) mit Werten, bilde aus a und b die Vereinigungsmenge in c ( c =3D a | b ) und will dann auf das Attribut liste von c zugreifen bekomme ich folgende Meldung: Traceback (most recent call last): File "<pyshell#91>", line 1, in -toplevel- print c.liste AttributeError: 'Newset' object has no attribute 'liste' Ich kann ja verstehen das sich an der Menge in liste von Objekt c nichts ändert, was ich aber nicht verstehe ist, warum das Attribut "liste" nicht mit in c übernomen wird. Kann mir einer das erklären? und kann man das irgendwie erreichen? Schon mal danke im voraus mfg Albert _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Albert Hermeling wrote:
Traceback (most recent call last): File "<pyshell#91>", line 1, in -toplevel- print c.liste AttributeError: 'Newset' object has no attribute 'liste'
Ich find's unwarscheinlich, daß das so gehen kann, bin aber beim Grübeln an die Grenzen meines Wissens bzgl. Python Interna gestoßen. Mich würde an der Stelle allein schon interessieren, wieso da überhaupt ein Newset Objekt 'rauskommt? Ich denke da wird der |-Operator von set verwendet und der sollte doch auch sets zurückliefern? Gruß, Achim _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Albert Hermeling wrote:
class Newset(set): def __init__(self,): set.__init__(self,) self.liste =3D [] def update(self, seg): set.update(self,seg) for i in seg: if not i in self.liste: self.liste.append(i)
Erzeuge ich jetzt zwei Objekte a und b und fühle sie mit a.update(range(5)) bzw. b.update(range(3)) mit Werten, bilde aus a und b die Vereinigungsmenge in c ( c =3D a | b ) und will dann auf das Attribut liste von c zugreifen bekomme ich folgende Meldung:
AttributeError: 'Newset' object has no attribute 'liste'
Laut Sourcen verwendet set.__or__() zur Erzeugung des Resultats die Methode copy(). Diese Methode wiederum umgeht den normalen Konstruktor, weil sie sonst nicht ein Newset, sondern nur ein normales set erzeugen könnte. Damit dein Beispiel so funktioniert, wie du das erwartest, solltest du also auch copy() mit einer eigenen Version überschreiben. In der Doku habe ich auf die Schnelle auch nichts gefundne, was auf diesen Umstand hinweist. -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Sonntag, 6. Februar 2005 20:24 schrieb Georg Mischler: Guten Morgen Georg,
Albert Hermeling wrote:
class Newset(set): def __init__(self,): set.__init__(self,) self.liste =3D [] def update(self, seg): set.update(self,seg) for i in seg: if not i in self.liste: self.liste.append(i)
Erzeuge ich jetzt zwei Objekte a und b und fühle sie mit a.update(range(5)) bzw. b.update(range(3)) mit Werten, bilde aus a und b die Vereinigungsmenge in c ( c =3D a | b ) und will dann auf das Attribut liste von c zugreifen bekomme ich folgende Meldung:
AttributeError: 'Newset' object has no attribute 'liste'
Laut Sourcen verwendet set.__or__() zur Erzeugung des Resultats die Methode copy(). ... das erwartest, solltest du also auch copy() mit einer eigenen Version überschreiben.
So nach einigen rumprobieren habe ich folgende Lösung gefunden: class NewSet(set): def __init__(self,): set.__init__(self,) self.liste = [] def update(self, seg): set.update(self,seg) for i in seg: if not i in self.liste: self.liste.append(i) def __or__(self, x): a = set.__or__(self, x) a.liste = self.liste return a a = NewSet() b = NewSet() a.update(range(5,15)) b.update(range(10)) c = a | b print c print c.liste Deine Vorschlag die copy Methode zu überschreiben funktionierte nicht. Es reicht die Methode __or__ zu überschreiben. Wenn ich die copy Methode überschreiben bekomme ich immer ein None Objekt zurück. Da ich gerne dazu lerne würde ich gerne wissen warum das so ist. mfg Albert _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Albert Hermeling wrote:
Deine Vorschlag die copy Methode zu überschreiben funktionierte nicht. Es reicht die Methode __or__ zu überschreiben. Wenn ich die copy Methode überschreiben bekomme ich immer ein None Objekt zurück. Da ich gerne dazu lerne würde ich gerne wissen warum das so ist.
Nach nochmaliger Betrachtung war dieser Punkt wohl ein Denkfehler meinerseits, aber None sollte deswegen trotzdem nicht rauskommen. Tatsächlich ist es nicht die Python-Methode copy(), sondern die dahinterliegende Funktion set_copy() in C, welche direkt aufgerufen wird. Damit bleibt das Überschreiben von copy() für deine Zwecke schlicht wirkungslos, und ich habe dich erst mal auf die falsche Fährte geschickt. Der ganze interne Aufwand scheint nur den einen Zweck zu haben, dass binäre Operatoren zwischen set und frozen_set jeweils ein neues Objekt vom Typ des linken Operanden zurückgeben können. Das ist zwar raffiniert, aber nicht allgemein genug gelöst, um für abgeleitete Klassen vernünftig nutzbar zu sein. Dass du dann mit c = a | b ein (nur halb initialisiertes) Newset kriegst, sieht eher nach einem unbeabsichtigten Nebeneffekt aus, der einem leicht zu falschen Schlüssen verleiten kann. So einfach ist es offenbar auch für die Core-Entwickler nicht, die Unterschiede zwischen eingebauten und in Python geschriebenen Klassen zu überbrücken... -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
Achim Domma (Procoders)
-
Albert.Hermeling@t-online.de
-
Georg Mischler