Klassen die Instanzen von sich selbst enthalten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
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 :)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Gast

danke für die schnell antwort!

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