Damit ein Objekt A ein anderes Objekt B ansprechen kann, muss es dessen Referenz kennen. Dazu muss die Referenz über den Konstruktor oder eine Methode übergeben werden.
Vom grundsätzlich Verhalten her unterscheiden wir in
Bei einer einseitigen Beziehung kennt ein Objekt „A“ ein anderes Objekt „B“ aber nicht umgekehrt.
Abb: Klassen in einer einseitigen Beziehung
Eine Person kann auch keinen Geldbeutel besitzen. Daher wird hier die Referenz über eine Methode gesetzt. So sind die Erzeugung des Personen-Objekts und die Zuweisung der Referenz zeitlich unabhängig.
Dies zeigt das zugehörige Sequenz-Diagramm eindeutig auf.
Abb: Sequenz-Diagramm der Zuweisung einer einseitigen Beziehung über eine Methode
class Person: def __init__(self, name): self._name = name self._wallet = None # die Referenz wird erst später zugewiesen @property def name(self): return self._name @property def wallet(self): return self._wallet @wallet.setter def wallet(self, wallet): self._wallet = wallet class Wallet: def __init__(self): pass def deposit_money(self, amount): pass def withdraw_money(self, amount): pass if __name__ == '__main__': person = Person('Max') wallet = Wallet() person.wallet = wallet
Abb: Klassen in einer einseitigen Beziehung
Ein Stromschalter braucht immer eine Wippe, sonst kann er ja nicht benutzt werden. Daher muss sichergestellt sein, dass mit der Erzeugung des Stromschalter-Objektes auch die Referenz zu einer Wippe gesetzt wird. Es ist also wichtig, dass die Referenz mit dem Konstruktor geliefert wird. In diesem Fall ist es zwingend, dass die Wippe zeitlich zuerst erzeugt wird, so dass ihre Referenz verfügbar ist.
class PowerSwitch: def __init__(self, type, actuator): self._type = type self._actuator = actuator @property def type(self): return self._type class Actuator: def __init__(self): self._position = False def press(self): pass def release(self): pass def is_pressed(self): return self._position if __name__ == '__main__': actuator = Actuator() switch = PowerSwitch('single', actuator)