[Python-de] Von der Klasse set() erben

Albert Hermeling Albert.Hermeling at t-online.de
Mon Feb 7 01:35:50 CET 2005


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