
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 baerguenther.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 Mailinglistepython-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 baerguenther.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 baerguenther.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 Mailinglistepython-de@python.org Reply-To: Die Deutsche Python Mailinglistepython-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 baerguenther.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