Problem mit Modulen/Objekten

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.
cheaze
User
Beiträge: 13
Registriert: Sonntag 6. April 2014, 21:02

Nicht das ich an der Sache drum rum reiten will :roll:

Habe hier in MonoDevelop eine Gtk Anwendung ensprechend angepasst, dass ich sowohl über Session als auch MainWindow untereinander die Methoden abrufen kann. Beide Singleton.

Funktioniert ohne Probleme. Vielleicht hilft es bei meinem Problem, hier nach zu vollziehen was ich meine.
Gibt es auch in Python die Möglichkeit den Sachverhalt genauso nachzubilden?

Main.cs

Code: Alles auswählen

using System;
using Gtk;
namespace GtkApp
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Application.Init ();
			MainWindow.Instance.Show();
			Session.Instance.TestGUI();
			Application.Run ();
		}
	}
}
Session.cs

Code: Alles auswählen

using System;

namespace GtkApp
{
	public sealed class Session
	{
		private static Session instance = new Session();

		public static Session Instance {
			get {
				return instance;
			}
		}

		private Session ()
		{
			// TODO:
		}

		public void TestGUI( )
		{
			MainWindow.Instance.MsgBox("Test GUI");
		}
	}
}
MainWindow.cs

Code: Alles auswählen

using System;
using Gtk;

public sealed partial class MainWindow: Gtk.Window
{	
	private static MainWindow instance = new MainWindow();

	public static MainWindow Instance {
		get {
			return instance;
		}
	}

	private MainWindow (): base (Gtk.WindowType.Toplevel)
	{
		Build ();
	}
	
	private void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}

	public ResponseType MsgBox (string msg)
	{
		MessageDialog md = new MessageDialog(this, DialogFlags.Modal, MessageType.Info, ButtonsType.Ok, msg);
		md.Title = "Test";
		ResponseType tp = (ResponseType)md.Run ();
		md.Destroy();
		return tp;
	}
	private void OnButton2Clicked (object sender, EventArgs e)
	{
		GtkApp.Session.Instance.TestGUI();
	}
}
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Uns ist mittlerweile schon allen klar was du möchtest. Du musst jetzt nur noch begreifen, dass deine Lösung keine saubere Lösung für das Problem ist. Egal in welcher objektorientierten Sprache. Hättest du hier als erstes dein C#-Beispiel gezeigt, dann wären dir die selben Argumente um die Ohren geflogen.
Das Leben ist wie ein Tennisball.
cheaze
User
Beiträge: 13
Registriert: Sonntag 6. April 2014, 21:02

Es mag sein, dass es nicht die saubere Lösung ist. Dennoch es ist machbar. Solange es nur die obersten Objekte in der Hierarchie betrifft, ist es praktisch.
Es ist kein kommerzielles Projekt, also kann ich mir auch den Stil und Aufbau selbst aussuchen :wink:

Leider begreife ich Python nicht in allen Faccetten. Vielleicht ist das eher mein Problem bei der Sache. Wie soll ich da jetzt aber durchsteigen, wenn die einfachere Lösung einfach nur schneller geht...
BlackJack

@cheaze: Wenn die Lösung tatsächlich einfacher und schneller wäre, hättest Du sie vielleicht schon fertig. ;-)

Die Sprachkonstrukte von C# lassen sich nicht alle ohne Nachzudenken 1:1 auf Python übertragen. Eine Frage für uns ist jetzt ja was die Motivation ist darüber nachzudenken wie man eine Lösung portiert, die in unseren Augen gar keine vernünftige Lösung ist.

Namensräume sind in Python nichts abstraktes was zur Übersetzungszeit vom Compiler berücksichtigt/durchgesetzt wird, sondern Objekte die zur Laufzeit existieren beziehungsweise erstellt werden. Der Namensraum in den man üblicherweise Klassen steckt sind Modulobjekte. Ein Modul wird üblicherweise durch eine Datei beschrieben. Eine Datei pro Klasse ist in Python aus diesem Grund nicht üblich, denn damit entwertet man das Modul als Organisationseinheit von Klassen und Funktionen die thematisch zusammen gehören.

Simple ”Lösung” wäre also die Klassen in einem Modul definieren, nach den Klassendefinitionen auf Modulebene jeweils ein Exemplar erzeugen, und in den Methoden einfach auf diese modulglobalen Exemplare zuzugreifen. Semantisch ist das letztendlich ja nichts anderes was Du in dem C#-Programm tust.
cheaze
User
Beiträge: 13
Registriert: Sonntag 6. April 2014, 21:02

@BlackJack: Das kann natürlich sein :wink:

Allerdings bin gerade am Anfang (gestern damit angefangen). Und bin noch am überlegen was ich nehmen soll. Für meine Selbstständigkeit brauche ich ein Programm in der Art eines Journals mit Finanzen sowie einer Datenbank. Wobei ich das Programm in der Funktionalität flexibel ändern und erweitern kann. So weit, so gut.

Habe vor einigen Jahren damit angefangen in C++ eine OpenGL-Umgebung zu programmieren. Dabei war ich monatelang am Stricken. Als ich Python entdeckt habe, habe ich dieselbe Umgebung in nur einer Woche umgesetzt. Das war dann auch die beachtliche Leistung von Python.

In der Zwischenzeit habe auch schon in C# programmiert. Daher war auch meine Überlegung: C/C++ kommt nicht in Frage, da zu aufwendig. Python geht relativ schnell und überschaubar. Allerdings tendiere ich wieder auf C#, da ich hier weniger am Konzept der Sprache selbst was Neues lernen muss.

In diesem Sinne :D

Vielen Dank noch mal für die Hilfe!
Antworten