On 12/27/11 12:34 , Ian Kelly wrote:
On Tue, Dec 27, 2011 at 1:31 PM, K Richard Pixley<r...@noir.com>  wrote:
On 12/27/11 10:28 , Ian Kelly wrote:
On Tue, Dec 27, 2011 at 10:41 AM, K Richard Pixley<r...@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.
r...@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

r...@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
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to