Singleton in Python Cookbook

Steve Holden steve at holdenweb.com
Thu Jul 26 06:35:23 CEST 2007


Alex Popescu wrote:
> Alex Popescu <nospam.themindstorm at gmail.com> wrote in 
> news:Xns9979172DC38F1themindstorm at 80.91.229.5:
> 
>> "Diez B. Roggisch" <deets at nospam.web.de> wrote in
>> news:5gq00tF3fm71gU1 at mid.uni-berlin.de: 
>>
>>> Alex Popescu schrieb:
>>>> Hi all!
>>>>
>>>> I was reading through Python Cookbook the Singleton recipe. At this
>>>> moment I am a bit puzzled as the example in the book is not working
>>>> resulting in: 
>>>>
>>>> TypeError: type.__new__(SingleSpam): SingleSpam is not a subtype of
>>>> type 
>>>>
>>>> (I haven't presented the original code as I am not sure about
>>>> copyrights). 
>>> AFAIK the cookbook is completely found online at ASPN. So no sweat 
>>> publishing it here.
>>>
>>>
>>> And regarding the problem: is it possible that you forgot to subclass 
>>> SingleSpam from object?
>>>
>>> Diez
>> The exact code:
>> class Singleton(object):
>>     """ A Pythonic Singleton """
>>     def _ _new_ _(cls, *args, **kwargs):
>>         if '_inst' not in vars(cls):
>>             cls._inst = type._ _new_ _(cls, *args, **kwargs)
>>         return cls._inst
>>
>> if _ _name_ _ == '_ _main_ _':
>>     class SingleSpam(Singleton):
>>         def _ _init_ _(self, s): self.s = s
>>         def _ _str_ _(self): return self.s
>>     s1 = SingleSpam('spam')
>>     print id(s1), s1.spam( )
>>     s2 = SingleSpam('eggs')
>>     print id(s2), s2.spam( )
>>
>> ./alex
>> --
>> .w( the_mindstorm )p.
>>
> I got it working in 2 ways:
> 
> class Singleton(object):
>   """ A Pythonic Singleton """
>   def __new__(cls, *args, **kwargs):
>     if '_singletoninstance' not in vars(cls):
>       #variant 1: cls._singletoninstance = object.__new__(cls, *args, 
> **kwargs)
>       #variant 2: cls._singletoninstance = super(type, cls).__new__(cls, 
> *args, **kwargs)
>     return cls._singletoninstance
> 
> Both of these seem to work.
> 
If, that is, "work" means "Raise an AttributeError due to the missing 
spam() method". This appears to fix that problem:

class Singleton(object):
     """ A Pythonic Singleton """
     def __new__(cls, *args, **kwargs):
         if '_inst' not in vars(cls):
             cls._inst = object.__new__(cls, *args, **kwargs)
         return cls._inst

if __name__ == '__main__':
     class SingleSpam(Singleton):
         def __init__(self, s): self.s = s
         def __str__(self): return self.s
     s1 = SingleSpam('spam')
     print id(s1), s1
     s2 = SingleSpam('eggs')
     print id(s2), s2
     print str(s1)

regards
  Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC/Ltd           http://www.holdenweb.com
Skype: holdenweb      http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------




More information about the Python-list mailing list