Alex Popescu wrote: > Alex Popescu <[EMAIL PROTECTED]> wrote in > news:[EMAIL PROTECTED]: > >> "Diez B. Roggisch" <[EMAIL PROTECTED]> wrote in >> news:[EMAIL PROTECTED]: >> >>> 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 ------------- -- http://mail.python.org/mailman/listinfo/python-list