Singleton implementation problems
George Sakkis
george.sakkis at gmail.com
Thu Jul 3 21:15:57 EDT 2008
On Jul 3, 6:58 pm, Urizev <uri... at gmail.com> wrote:
> Hi everyone
>
> I have developed the singleton implementation. However I have found a
> strange behaviour when using from different files. The code is
> attached.
>
> Executing main
> new MySet object
> No singleton instance
> New singleton:
> <__main__.Singleton instance at 0x2b98be474a70>
> new MySet object
> There is a singlenton instance
> new Member
> new MySet object
> No singleton instance
> New singleton:
> <myset.Singleton instance at 0x2b98be474d88>
> new Member
> new MySet object
> There is a singlenton instance
> new Member
> new MySet object
> There is a singlenton instance
>
> I do not know why, but it creates two instances of the singleton. Does
> anybody know why?
Because __init__() is called to initialize the state of an object
*after* it has already been created. You should create a "new-style"
class and define __new__() instead. Here's a working version:
class Singleton(object): # new-style class
def __new__(cls, *args, **kwds):
# return the singleton (if already created)
try: return cls.__dict__['__singleton']
except KeyError: # raised only the first time for a given
class
# create the singleton and store it to the class namespace
singleton = object.__new__(cls, *args, **kwds)
setattr(cls, '__singleton', singleton)
return singleton
class X(Singleton):
def __init__(self, a): self.a = a
assert X(1) is X(2)
Note however that the classic Singleton pattern is usually frowned
upon in Python; the preferred approach is to use (module level)
globals. Also search for the "Borg pattern".
George
More information about the Python-list
mailing list