Von einem Objekt auf Methoden des anderen Objekt zugreifen?

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
PyByte
User
Beiträge: 25
Registriert: Samstag 16. Oktober 2010, 03:32

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
PyByte
User
Beiträge: 25
Registriert: Samstag 16. Oktober 2010, 03:32

Ich habe es nun im Prinzip folgendermaßen gelöst:

Code: Alles auswählen

a = KlasseA()
b = KlasseB()
a.b = b
b.a = a
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
PyByte
User
Beiträge: 25
Registriert: Samstag 16. Oktober 2010, 03:32

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PyByte: Du hast jetzt erklärt warum die Logik auf den Automaten zugreifen muss – aber warum muss der Automat die Logik kennen?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
PyByte
User
Beiträge: 25
Registriert: Samstag 16. Oktober 2010, 03:32

@__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)
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
PyByte
User
Beiträge: 25
Registriert: Samstag 16. Oktober 2010, 03:32

@__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)
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
PyByte
User
Beiträge: 25
Registriert: Samstag 16. Oktober 2010, 03:32

@__blackjack__

Ja tomato, kleiner Spaß :D
Danke nochmal.
Antworten