Peter Hansen wrote:
Felix Wiemann wrote:
Sometimes (but not always) the __new__ method of one of my classes
returns an *existing* instance of the class. However, when it does
that, the __init__ method of the existing instance is called
nonetheless, so that the instance is initialized a second time. For
example, please consider the following class (a singleton in this case):
[snip]
How can I prevent __init__ from being called on the already-initialized
object?
Is this an acceptable kludge?
>>> class C(object):
... instance=None
... def __new__(cls):
... if C.instance is None:
... print 'creating'
... C.instance = object.__new__(cls)
... else:
... cls.__init__ = lambda self: None
... return cls.instance
... def __init__(self):
... print 'in init'
...
>>> a = C()
creating
in init
>>> b = C()
>>>
(Translation: dynamically override now-useless __init__ method.
But if that works, why do you need __init__ in the first place?)
-Peter
Or this one: use an alternative constructor:
class C(object):
instance = None
@classmethod
def new(cls, *args, **kw):
if cls.instance is None:
print 'Creating instance.'
cls.instance = object.__new__(cls)
print 'Created.'
cls.instance.__init__(*args,**kw)
return cls.instance
def __init__(self):
print 'In init.'
>>> c = C.new()
Creating instance.
Created.
In init.
>>> c = C.new()
>>>
Michael
--
http://mail.python.org/mailman/listinfo/python-list