Seite 1 von 1

Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Samstag 25. Mai 2019, 13:09
von PyByte
Hallo,

angenommen ich habe so etwas:

Code: Alles auswählen

a = KlasseA()
b = KlasseB(a)
Ich kann bei so was im Objekt b Methoden des Objekt a aufrufen. Aber wie kann ich umgekehrt Methoden im Objekt b in Objekt a aufrufen?
Ich will also Zugriff haben von a auf b, ohne Vererbung.

In meinem konkreten Fall habe ich die Klassen Automaton, Logic und View. Ich übergebe Objekte der Klassen Logic und View an ein Objekt der Klasse Automaton und will nun aus dem Logic Objekt heraus, auf Methoden von Automaton zugreifen können.

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Samstag 25. Mai 2019, 14:16
von __blackjack__
@PyByte: Dazu musst Du dem `Logic`-Objekt das `Automaton`-Objekt irgend wie bekannt machen, beziehungsweise dessen Methoden die das `Logic`-Objekt aufrufen soll, beispielweise als Rückruffunktionen registrieren. Wie man das genau am besten macht, hängt davon ab wie die in Beziehung stehen/welche Rolle die jeweiligen Objekte in verwendeten Entwurfsmustern oder Idiomen spielen.

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Samstag 25. Mai 2019, 21:22
von PyByte
Ich habe es nun im Prinzip folgendermaßen gelöst:

Code: Alles auswählen

a = KlasseA()
b = KlasseB()
a.b = b
b.a = a

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Samstag 25. Mai 2019, 21:33
von Sirius3
@PyByte: eigentlich will man eine zu enge Kopplung zwischen zwei Klassen vermeiden.
Kannst Du Dein eigentliches Problem genauer erklären, damit wir eine wirkliche Lösung erarbeiten können?

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Samstag 25. Mai 2019, 22:03
von PyByte
Sirius3 hat geschrieben: Samstag 25. Mai 2019, 21:33 @PyByte: eigentlich will man eine zu enge Kopplung zwischen zwei Klassen vermeiden.
Kannst Du Dein eigentliches Problem genauer erklären, damit wir eine wirkliche Lösung erarbeiten können?
Ich versuche einen zellularen Automaten zu entwickeln das modular aufgebaut ist. Dabei gibt es folgende Klassen:
Automaton: Klasse Definiert die Struktur des Automaten und enthält die Methoden wie man auf die einzelnen Zellen des Automaten zugreift. Enthält Methoden wie get_cell(coordinate)
Logic Klasse: Enthält die Logik wie die Zellen bei jeder Aktualisierung des Automaten verändert werden. Diese Klasse muss Methoden wie get_cell(coordinate) in Automaton nutzen.
View Klasse: Die Klasse kümmert sich um die grafische Darstellung des zellularen Automaten, dafür bekommt es von Automaton immer wieder die aktuelle Matrix des Automaten.

Durch diesen Aufbau kann ich verschiedene Logik Klassen entwickeln und kann auch verschiedene View Klassen haben. Aktuell erfolgt die Darstellung über pygame, möglicht wäre beispielsweise über Tkinter oder PyQT.

Mir fehlt leider die Erfahrung. Wie würde denn eine saubere Lösung aussehen damit ich von Logic aus Methoden in Automaton aufrufen kann?
Die Logik soll halt in einer separaten Klasse laufen aber von da aus muss ich ja irgendwie auf den Automaten und seine Zell Zustände zugreifen können um mein Algorithmus anzuwenden.

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Samstag 25. Mai 2019, 22:38
von __blackjack__
@PyByte: Du hast jetzt erklärt warum die Logik auf den Automaten zugreifen muss – aber warum muss der Automat die Logik kennen?

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Sonntag 26. Mai 2019, 13:53
von PyByte
@__blackjack__

Gute Frage. Mir fehlt die Erfahrung und daher weiß ich auch noch nicht genau wie ich das alles strukturiere.
Ich habe die Abhängigkeiten verändert. Aktuell sieht es nun so aus und es funktioniert:

Code: Alles auswählen

import automaton
import lifelogic
import view

a = automaton.Automaton((80, 80), int, True) # Automat mit einer 80x80 Matrix und int Zellen
logic = lifelogic.Lifelogic(a)
view = view.View((800, 600), 10, "GoL", 250)

while True:
    logic.execute()
    view.show(a.space)

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Sonntag 26. Mai 2019, 15:24
von __blackjack__
@PyByte: Ein Modul pro Klasse ist eher nicht Python sondern Java. Und wenn man ein Programm aus mehr als einem Modul hat, sollte man die Module in ein Package stecken, damit auf ”oberster Ebene” nur ein Name mit all den anderen Modulen und Packages konkurriert.

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Sonntag 26. Mai 2019, 18:22
von PyByte
@__blackjack__

Erledigt. Danke! :)

Code: Alles auswählen

import automaton as tomato

a = tomato.Automaton((80, 80), int, True)
logic = tomato.Lifelogic(a)
view = tomato.View((1100, 1100), 10, "GoL", 250)

while True:
    logic.execute()
    view.show(a.space)

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Sonntag 26. Mai 2019, 18:53
von __blackjack__
@PyByte: `tomato`‽

Code: Alles auswählen

#!/usr/bin/env python3
from automaton import Automaton, Lifelogic, View


def main():
    automaton = Automaton((80, 80), int, True)
    logic = Lifelogic(automaton)
    view = View((1100, 1100), 10, 'GoL', 250)

    while True:
        logic.execute()
        view.show(automaton.space)


if __name__ == '__main__':
    main()

Re: Von einem Objekt auf Methoden des anderen Objekt zugreifen?

Verfasst: Sonntag 26. Mai 2019, 20:17
von PyByte
@__blackjack__

Ja tomato, kleiner Spaß :D
Danke nochmal.