confused about __new__
K Richard Pixley
rich at noir.com
Tue Dec 27 17:19:44 EST 2011
More information about the Python-list mailing list
Tue Dec 27 17:19:44 EST 2011
- Previous message (by thread): confused about __new__
- Next message (by thread): confused about __new__
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 12/27/11 12:34 , Ian Kelly wrote: > On Tue, Dec 27, 2011 at 1:31 PM, K Richard Pixley<rich at noir.com> wrote: >> On 12/27/11 10:28 , Ian Kelly wrote: >>> >>> On Tue, Dec 27, 2011 at 10:41 AM, K Richard Pixley<rich at noir.com> wrote: >>>> >>>> The conceptual leap for me was in recognizing that a class is just an >>>> object. The best way, (imo, so far), to create a singleton in python is >>>> to >>>> use the class itself as the singleton rather than ever instantiating it. >>>> With a little work, you can even prevent it from ever being >>>> instantiated. >>> >>> I don't think that's actually possible: >>> >>> Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit >>> (Intel)] on win32 >>> Type "help", "copyright", "credits" or "license" for more information. >>>>>> >>>>>> class Foo: >>> >>> ... def __new__(cls): >>> ... raise TypeError >>> ... def __init__(self): >>> ... raise TypeError >>> ... >>>>>> >>>>>> type(object.__new__(Foo)) >>> >>> <class '__main__.Foo'> >> >> >> Try: >> >> class Foo(object): >> def __new__(cls): >> return cls > > > Okay: > > Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit > (Intel)] on win32 > Type "help", "copyright", "credits" or "license" for more information. >>>> class Foo: > ... def __new__(cls): > ... return cls > ... >>>> f1 = object.__new__(Foo) >>>> f2 = object.__new__(Foo) >>>> type(f1), type(f2) > (<class '__main__.Foo'>,<class '__main__.Foo'>) >>>> f1 is f2 > False I'm not seeing why you're using "object.__new__". With Foo(), it seems fine. rich at fuji-land.noir.com> python Python 2.7.2 (default, Dec 12 2011, 13:05:49) [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> class Foo(object): ... def __new__(cls): ... return cls ... >>> f1 = Foo() >>> f2 = Foo() >>> id(Foo) 4298515984 >>> id(f1) 4298515984 >>> id(f2) 4298515984 rich at fuji-land.noir.com> python3 Python 3.2.2 (default, Dec 26 2011, 15:03:08) [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> class Foo(object): ... def __new__(cls): ... return cls ... >>> f1 = Foo() >>> f2 = Foo() >>> id(f1) 4298841008 >>> id(f2) 4298841008 >>> f1.stuff = True >>> f2.stuff True >>> id(Foo) 4298841008 Are you trying to demonstrate that I haven't prevented you from instantiating Foo? If so, then I will cede that point. I certainly don't know enough about python internals just now to even claim to be capable of protecting a class from a hostile user. My guess is that short of a privileged/unprivileged split, or castrating the interpreter and locking you into it, such a protection would not be possible. My point was that I can indeed intercept common and convenient usage to create a lovely singleton semantic. I can't force you to use it. (Nor do I have any motivation to so do.) --rich
- Previous message (by thread): confused about __new__
- Next message (by thread): confused about __new__
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list