Hallo zusammen, bin gerade dabei, mir die Metaklassen mal näher anzuschauen. Dabei ist mir beim erstellen eines Singleton etwas aufgefallen. Unter 2.7 kann man folgendes machen: import gobject class Singleton(gobject.GObjectMeta): def __init__(self,name,bases,dict): super(Singleton,self).__init__(name,bases,dict) self.instance=None def __call__(self,*args,**kw): if self.instance is None: self.instance=super(Singleton,self).__call__(*args,**kw) return self.instance class MetaTest(object): __metaclass__=Singleton def __init__(self,initval=0): self.data=initval def show(self): print self.data obj1=MetaTest() obj2=MetaTest() print obj1 <__main__.MetaTest object at 0xa3906cc> print obj2 <__main__.MetaTest object at 0xa3906cc> obj1.val=1 print obj2.val 1 Somit greife ich immer auf die gleiche Instanz. Jetzt habe ich das gleiche unter Python3 versucht. Was ich hier gefunden habe ist, dass ich gobject nicht mehr direkt importieren kann, sondern das gi - Modul verwenden muss. from gi.repository import GObject Dennoch ist es mir nicht gelungen gleiche Instanzen zu bekommen. Was mache ich hier falsch? Oder muss ich da einfach anders vorgehen? Gruss, Günther
On Sun, 20 Nov 2011 11:36:30 +0100 guenther baer <guenther.baer@bliscon.de> wrote:
Dennoch ist es mir nicht gelungen gleiche Instanzen zu bekommen. Was mache ich hier falsch? Oder muss ich da einfach anders vorgehen?
Gut und wo ist nun dein eigentliches Problem? Warum brauchst du ein Singleton? grüße, Marek
Am 20.11.2011 13:18, schrieb Marek Kubica:
On Sun, 20 Nov 2011 11:36:30 +0100 guenther baer<guenther.baer@bliscon.de> wrote:
Dennoch ist es mir nicht gelungen gleiche Instanzen zu bekommen. Was mache ich hier falsch? Oder muss ich da einfach anders vorgehen? Gut und wo ist nun dein eigentliches Problem? Warum brauchst du ein Singleton?
grüße, Marek _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Wenn du es wissen solltest, warum antwortest du nicht einfach auf die Frage. Wenn nicht, warum antwortest du dann darauf? Sorry, aber diese Antwort ist alles anderes als Konstruktiv! Es gibt eben Programme, die verwenden Singletons und ich möchte einfach nur verstehen, wie dies in Python3 umzusetzen ist. Gruß, Günther
Es gibt verschiedene Gründe gegen Singletons, weil die, zumindest nach Ansicht einiger Menschen, in Python broken by design sind (z.B. bei Subklassen). Um zu verstehen, welche Alternative für Dich an Besten ist, muss man schon wissen, was Du damit erreichen willst. Gruß, Bernhard -----Original Message----- From: guenther baer <guenther.baer@bliscon.de> Sender: python-de-bounces+bernhard.bockelbrink=gmx.de@python.org Date: Sun, 20 Nov 2011 20:05:12 To: Die Deutsche Python Mailingliste<python-de@python.org> Reply-To: Die Deutsche Python Mailingliste <python-de@python.org> Subject: Re: [Python-de] Singleton unter Python3 Am 20.11.2011 13:18, schrieb Marek Kubica:
On Sun, 20 Nov 2011 11:36:30 +0100 guenther baer<guenther.baer@bliscon.de> wrote:
Dennoch ist es mir nicht gelungen gleiche Instanzen zu bekommen. Was mache ich hier falsch? Oder muss ich da einfach anders vorgehen? Gut und wo ist nun dein eigentliches Problem? Warum brauchst du ein Singleton?
grüße, Marek _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Wenn du es wissen solltest, warum antwortest du nicht einfach auf die Frage. Wenn nicht, warum antwortest du dann darauf? Sorry, aber diese Antwort ist alles anderes als Konstruktiv! Es gibt eben Programme, die verwenden Singletons und ich möchte einfach nur verstehen, wie dies in Python3 umzusetzen ist. Gruß, Günther _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Hallo Bernhard Also nach meinem Verständnis (sag es mir bitte wenn ich falsch liege) dient ein Singleton dazu zu verhindern, dass mehrere Objekte einer Klasse gebildet werden können. Somit soll wohl verhindert werden, dass ein bestimmtes Programm mehrfach gestartet werden kann. Das bereits beschriebene Verfahren habe ich in einem Programm entdeckt und wollte einfach nur wissen, wie es unter Python3 umgesetzt werden könnte. Sollte es aber andere Verfahren geben, wie so etwas umgesetzt werden kann, bin ich für Informationen sehr dankbar. Gruß, Günther Am 20.11.2011 20:19, schrieb bernhard.bockelbrink@gmx.de:
Es gibt verschiedene Gründe gegen Singletons, weil die, zumindest nach Ansicht einiger Menschen, in Python broken by design sind (z.B. bei Subklassen).
Um zu verstehen, welche Alternative für Dich an Besten ist, muss man schon wissen, was Du damit erreichen willst.
Gruß,
Bernhard
-----Original Message----- From: guenther baer<guenther.baer@bliscon.de> Sender: python-de-bounces+bernhard.bockelbrink=gmx.de@python.org Date: Sun, 20 Nov 2011 20:05:12 To: Die Deutsche Python Mailingliste<python-de@python.org> Reply-To: Die Deutsche Python Mailingliste<python-de@python.org> Subject: Re: [Python-de] Singleton unter Python3
Am 20.11.2011 13:18, schrieb Marek Kubica:
On Sun, 20 Nov 2011 11:36:30 +0100 guenther baer<guenther.baer@bliscon.de> wrote:
Dennoch ist es mir nicht gelungen gleiche Instanzen zu bekommen. Was mache ich hier falsch? Oder muss ich da einfach anders vorgehen? Gut und wo ist nun dein eigentliches Problem? Warum brauchst du ein Singleton?
grüße, Marek _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Wenn du es wissen solltest, warum antwortest du nicht einfach auf die Frage. Wenn nicht, warum antwortest du dann darauf?
Sorry, aber diese Antwort ist alles anderes als Konstruktiv! Es gibt eben Programme, die verwenden Singletons und ich möchte einfach nur verstehen, wie dies in Python3 umzusetzen ist.
Gruß, Günther _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Hallo, On Sun, 20 Nov 2011 21:11:17 +0100 guenther baer <guenther.baer@bliscon.de> wrote:
Also nach meinem Verständnis (sag es mir bitte wenn ich falsch liege) dient ein Singleton dazu zu verhindern, dass mehrere Objekte einer Klasse gebildet werden können. Somit soll wohl verhindert werden, dass ein bestimmtes Programm mehrfach gestartet werden kann. Das bereits beschriebene Verfahren habe ich in einem Programm entdeckt und wollte einfach nur wissen, wie es unter Python3 umgesetzt werden könnte. Sollte es aber andere Verfahren geben, wie so etwas umgesetzt werden kann, bin ich für Informationen sehr dankbar.
Ich finde du hast da etwas überreagiert. Ich habe einfach ein XY-Problem vermutet, dass du dich eventuell verrannt hast in ein Problem und dass es vielleicht eine bessere Lösung gibt. Das ist durchaus Konstruktiv, auch wenn es nicht sofort auf dein akutes Problem eingeht. Und an dieser Stelle mus ich sagen, dass ich nicht verstehe was Singletons mit Programm mehrfach starten zu tun haben. Wenn ich mehrere Python-Interpreter starten will dann kann ich auch mehrere Singletons haben. Die gelten nicht per-se über Prozessgrenzen hinweg. Der mehrfache Programmstart ist übrigens ein Gelöstes Problem (TM), zumindest unter Linux gibt es dafür schon länger <https://live.gnome.org/LibUnique> welches inzwischen auch in GLib (GApplication) und GTK+ (GtkApplication) eingeflossen ist. Dabei wird der DBus-Session-Bus verwendet, was sicherstellt dass ein User ein Programm nur einmal starten kann, aber mehrere user auf der gleichen Maschine sich nicht behindern. Zudem ermöglicht Unique etwa die Übergabe von Programmparametern oder ähnliches in das bereits laufende Programm. grüße, Marek
Dennoch ist es mir nicht gelungen gleiche Instanzen zu bekommen. Was mache ich hier falsch? Oder muss ich da einfach anders vorgehen?
Metaklassen werden in Python 3 nicht mehr durch eine magische Variable __metaclass__ definiert, sondern durch ein Schlüsselwortargument in der Basisklassenliste. Ciao, Martin
participants (4)
-
"Martin v. Löwis"
-
bernhard.bockelbrink@gmx.de
-
guenther baer
-
Marek Kubica