Frage zur Verebung und Zugriffen

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
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Hallo,

ich habe gerade irgendeinen Denkfehler.
Ich würde gern folgende Strutur aufbauen:

Vater --> Kind --> Enkel

Nun möchte ich zunächst einen Vater erstellen mit einem Namen und einer ID, anschließend erstelle ich ein Kind mit Namen und ID und noch einen Enkel mit Namen und ID.
Jetzt möchte ich den Enkel einem Kind zuweisen und dem Kind einem Vater.
Das klappt soweit auch alles, aber wie kann ich mir jetzt von einer Enkel-Instanz die ID und den Namen des Vaters ausgeben lassen?

Habt ihr da eine Idee? Die Lösung ist vermutlich ganz einfach.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du in Deinem Baum in beide Richtungen laufen willst, mußt Du beide Richtungen in Deinen Objekten speichern, also jeder Konten hat ein Attribut child und parent.
imonbln
User
Beiträge: 191
Registriert: Freitag 3. Dezember 2021, 17:07

Ich glaube, was du suchst, ist keine Vererbung im programmatischen Sinne. Vater, Kind und Enkel haben alle gleichen Eigenschaften, und sollten daher Instanzen der gleichen Klasse Person sein.

Die Klasse Person dann ein Array an nachkommen. Der Vater hat in seinen Array die Kinder gespeichert und die Kinder in Ihren Array die Enkel.

Das Ganze entspricht in der Informatik am ehesten einer Verketten liste, auch wenn es eine Sonderform ist da bei der verketten liste normalerweise immer nur ein Nachkomme existiert.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@imonbln: Statt Array ist hier wohl eher Liste gemeint, und es ist auch eher ein Baum denn eine verkettete Liste. Der kann natürlich zu einer verketteten Liste ”degenerieren”, aber man würde das trotzdem als Baum bezeichnen, denn es muss ja nicht ein linearer Pfad sein.

@Patrick1990: Falls es tatsächlich eine verkette Liste sein sollte und kein Baum:

Code: Alles auswählen

#!/usr/bin/env python3
from attrs import define, field
from prettyprinter import cpprint, install_extras

install_extras(["attrs"])


@define
class Element:
    id = field()
    name = field()
    _next = field(default=None)
    _previous = field(default=None)

    @property
    def next(self):
        return self._next

    @next.setter
    def next(self, element):
        element._previous = self
        self._next = element

    @property
    def previous(self):
        return self._previous

    @previous.setter
    def previous(self, element):
        element._next = self
        self._previous = element


def main():
    father = Element(1, "Grandpa Simpson")
    child = Element(2, "Homer Simpson")
    grandchild = Element(3, "Lisa Simpson")

    grandchild.previous = child
    child.previous = father

    cpprint(father)
    print(grandchild.previous.previous is father)


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

Element(
    id=1,
    name='Grandpa Simpson',
    _next=Element(
        id=2,
        name='Homer Simpson',
        _next=Element(
            id=3,
            name='Lisa Simpson',
            _previous=<Recursion on Element with id=140254370740512>
        ),
        _previous=<Recursion on Element with id=140254370740432>
    )
)
True
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Vielen Dank, ich schaue mir das mal in Ruhe an :)
Antworten