Selbstreferenz im Hauptprogramm

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
Benutzeravatar
Bachsau
User
Beiträge: 7
Registriert: Sonntag 6. April 2014, 18:34

Hallo,

gibt es eine Möglichkeit auf die Funktionen des Hauptprogramms wie mit "self" innerhalb eines Objekts zu verweisen? Ich experimentiere gerade mit GtkBuilder, wo sich per XML definierte Handler über connect_signals(object) mit Funktionen verbinden lassen. Erwartet wird ein Objekt, dessen Methoden den in XML definierten Bezeichnern entsprechen, oder ein Dictionary, dass die Bezeichner den Funktionen zuordnet. Ich würde gern etwas übergeben, dass es mir ermöglicht, alle Funktionen direkt aufzurufen.

Gruß,
Bachsau
Benutzeravatar
Balmung
User
Beiträge: 44
Registriert: Sonntag 17. März 2013, 18:36

Du meinst das an connect_signals(obj) übergebene objekt soll eine Referenz zu dem "__main__" Programm sein, welches Funktionen auf modul-ebene definiert hat?
Du könntest __main__ importieren und dieses dann an connect_signals übergeben, oder wenn es mit dictionaries auch geht, könntest du auch globals() überegebn.
»Honk Honk«
Benutzeravatar
Bachsau
User
Beiträge: 7
Registriert: Sonntag 6. April 2014, 18:34

Danke. Also das mit den globals() funktioniert schonmal. :)
Allerdings ist das nur ein Schnappschuss zum Zeitpunkt des Aufrufs. Ich überlege gerade, ob es möglich ist, eine Methode zu erzeugen, die aufgerufen wird, wenn keine passende Methode definiert ist... Bin fortgeschrittener PHP-Depp, aber ganz neu bei Python, und da ist so etwas möglich. ;)

Das importieren von __main__ hab ich leider nicht ganz verstanden. Wird das nicht dazu führen, dass das ganze Programm noch einmal ausgeführt wird?
BlackJack

@Bachsau: Eine Methode die aufgerufen wird wenn ein Attribut abgefragt wird das es nicht gibt, kann man auch in Python schreiben. Ich frage mich allerdings was das in diesem Fall bringen soll. Zu dem Zeitpunkt wo Du `connect_signals()` aufrufst, müssen die Funktionen alle schon bekannt sein, denn damit kann man ja nichts verbinden was es nicht gibt. Also müsste das zu dem Zeitpunkt auch schon alles in `globals()` stehen.

Code auf Modulebene wird nur ein einziges mal ausgeführt, egal wie oft man ein Modul importiert. Und auch hier sollte man das genau wie bei `globals()` für Deinen Fall erst machen wenn die ganzen Definitionen schon ausgeführt wurden.

Üblicherweise steht das Hauptprogramm in einer `main()`-Funktion, die von folgendem Idiom am Ende des Moduls aufgerufen wird:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Benutzeravatar
Bachsau
User
Beiträge: 7
Registriert: Sonntag 6. April 2014, 18:34

BlackJack hat geschrieben:Zu dem Zeitpunkt wo Du `connect_signals()` aufrufst, müssen die Funktionen alle schon bekannt sein, denn damit kann man ja nichts verbinden was es nicht gibt.
Das stimmt. Man müsste alles mit einer Ersatzmethode verbinden, die später die eigentliche Funktion aufruft, und alle Daten übergibt. Zugegebenermaßen totaler Quatsch, weil man Funktionen vor Programmstart definiert. Aber zumindest als Proof of Concept schon interessant. :D
BlackJack hat geschrieben:Code auf Modulebene wird nur ein einziges mal ausgeführt, egal wie oft man ein Modul importiert.
Das hab ich schon raus ja. Ich dachte nur, dass man __main__ vielleicht zumindest einmal als Modul importieren kann, und wenn nein, hätte ich nicht erwartet, dass die Klassen trotzdem in die aktuelle Symboltabelle importiert werden.
BlackJack hat geschrieben:Üblicherweise steht das Hauptprogramm in einer `main()`-Funktion, die von folgendem Idiom am Ende des Moduls aufgerufen wird:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Ist das so, ja? Ich nehme an, es gibt praktische Gründe, nach diesem Paradigma zu programmieren? :)
BlackJack

@Bachsau: Zum ``if __name__ …``: Damit kann man das Modul ohne Nebeneffekte importieren, also insbesondere ohne dass der Code in diesem ``if``-Zweig ausgeführt wird. Zum Beispiel um das Modul wiederzuverwenden, oder um es in einer Python-Shell zu importieren und „live” Sachen auszuprobieren, und für Unit-Tests, und Werkzeuge die Module inspizieren, und Dokumentationssysteme, …
Benutzeravatar
Bachsau
User
Beiträge: 7
Registriert: Sonntag 6. April 2014, 18:34

Alles klar. Ich dachte, es hätte vielleicht noch einen anderen Grund. Danke für die Infos. :)
Antworten