Impressum
< Index

Beziehungen in Python umsetzen

Eine unidirektionale Beziehung, wie hier zwischen den Klassen Kunde und Konto, setzt man um, indem man der Klasse Kunde ein „Attribute“ mit dem Rollennamen vom Typ der Klasse Konto gibt.
Das Konto-Objekt mit dem Namen Girokonto kann von dem Kundenobjekt nun verwendet werden. Somit kann der Kunde von dem Konto-Objekt Methoden aufrufen und ggf. auf dessen Attribute zugreifen.
Klasse Kunde mit Relation zu Klasse Konto (gerichtet)
Unidirektionale Relation
class Kunde:
    def __init__(self):
        # ...
        self.Girokonto = Konto()

            

Multiplizitäten größer 1

Wenn die Relation eine kleine Anzahl von Objekten der Beziehungsklasse hat, kann man mehrere Attribute für diese anlegen.
Ist es jedoch eine große oder variable Anzahl, so nimmt man ein Array bzw. eine Liste.
Klasse Kunde mit Relation zu vielen Konten
Unidirektionale Relation zu vielen Konten
class Kunde:
    def __init__(self):
        # ...
        self.Konten = [] # neue Liste

    def addKonto(self, k):
        self.Konten.append(k)
            

Bidirektionale Assoziationen

Bei bidirektionalen Relationen kann muss man einer der Klassen bei erzeugen das Beziehungsobjekt mitgeben.
Hier im Beispiel erzeugt der Kunde das Konto und gibt dem Konstruktor (__init__) sich selbst als Inhaber mit.
Als Alternative kann man den Inhaber setzen, indem man nach der Erzeugung des Konto-Objekts den Inhaber des Konto-Objekts zuweist. Dies ist allerdings fehleranfälliger.
Was gar nicht geht ist, dass der Kunde ein Konto anlegt und das Konto einen neuen Kunden. Denn hier würde der Kunde ein Konto1 anlegen, das Konto1 legt einen Kunden2 an, dieser wieder ein Konto2, welches einen Kunden3 anlegt u.s.w.
Klasse Kunde und Konten mit bidirektionaler Assoziation mit Multiplizität von jeweils 1
Bidirektionale Relation zwischen Kunde und Konto
class Kunde:
    def __init__(self):
        # ...
        self.Giro = Konto(self)

    def nachricht(self, txt):
        print(txt)

class Konto:
    def __init__(self, kunde):        
        self.Inhaber = kunde
        self.saldo = 0
    
    def abheben(self, betrag):
        self.saldo =self.saldo-betrag
        if self.saldo<0:
            self.Inhaber.nachricht("überzogen")