Seite 1 von 1

Klassen die Instanzen von sich selbst enthalten

Verfasst: Freitag 4. Juni 2004, 16:01
von Seb
hi,

ich versuche einen baum durch klassen darzustellen.

ein instanz von S soll einen knoten darstellen.
der wert des knotens soll in self.f gespeichert werden, die blätter in der liste a. die elemente von a sind selbst wieder instanzen von S.

hier die klasse:

Code: Alles auswählen

class S:
    a = []
    def __init__(self, f):
        self.f = f
        
    def app(self, v):
        self.a.append(S(v))
aber das funktioniert so leider nicht.
es wird nicht unterschieden zwischen den versch. instanzen.
obwohl unterschiedliche adressen haben, scheinen alle gleich zu sein...

Code: Alles auswählen

>>> import c
>>> x = c.S("a")
>>> x
<c.S instance at 0x00A56440>
>>> x.f
'a'
>>> x.a
[]
>>> x.app("b")
>>> x.a
[<c.S instance at 0x00A563C8>]
>>> x.a[0]
<c.S instance at 0x00A563C8>
>>> x.a[0].f
'b'
>>> x.a[0].app("c")
>>> x
<c.S instance at 0x00A56440>
>>> x.a
[<c.S instance at 0x00A563C8>, <c.S instance at 0x00A564B8>]
>>> x.a[1]
<c.S instance at 0x00A564B8>
>>> x.a[1].f
'c'
>>> 

bin für jeden hinweis dankbar :)

Verfasst: Freitag 4. Juni 2004, 16:22
von Dookie
Hi Seb,

a ist in deinem Fall eine Klassenvariable und keine Instanzvariable. Klassenvariablen sind für alle Instanzen identisch.
So wirds klappen:

Code: Alles auswählen

class S:
    def __init__(self, f):
        self.a = []
        self.f = f
       
    def app(self, v):
        self.a.append(S(v)) 
Oder zum Angewöhnen mit Newstyleclassen:

Code: Alles auswählen

class S(object):
    __slots__ = ["a", "f"]
    def __init__(self, f):
        self.a = []
        self.f = f
       
    def app(self, v):
        self.a.append(S(v)) 
Für einen Enfachen 2-Wegebaum schau mal in diesen Thread


Gruß

Dookie

Verfasst: Freitag 4. Juni 2004, 16:31
von Gast
danke für die schnell antwort!

ich muss mich jetzt ja doch mal mit dieser OOP beschäftigen ...