Uwe Mayer wrote:
Hi,

I've been looking into ways of creating singleton objects. With Python2.3 I
usually used a module-level variable and a factory function to implement
singleton objects.

With Python2.4 I was looking into decorators. The examples from PEP 318
http://www.python.org/peps/pep-0318.html#examples

don't work - AFAIK because:
- you cannot decorate class definitions (why was it left out?)
- __init__ must return None


However, you can use the decorator:

def singleton(f):
instances = {}
def new_f(*args, **kwargs):
if (f not in instances):
instances[f] = f(*args, **kwargs)
return instances[f]
new_f.func_name = f.func_name
new_f.func_doc = f.func_doc return new_f


with a class that overwrites the __new__ methof of new-style classes:

class Foobar(object):
    def __init__(self):
        print self

    @singleton
    def __new__(self):
        return object.__new__(Foobar)

Is this particularly ugly or bad?

Seems a little confoluted. Why can't you just use something like:

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        try:
            return cls.__instance__
        except AttributeError:
            instance = cls.__instance__ = super(Singleton, cls).__new__(
                cls, *args, **kwargs)
            return instance

class Foobar(Singleton):
    def __init__(self):
        print self

?

STeVe
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to