Singleton implementation problems
Hi everyone
I have developed the singleton implementation. However I have found a
strange behaviour when using from different files. The code is
attached.
Executing main
new MySet object
No singleton instance
New singleton:
<__main__.Singleton instance at 0x2b98be474a70>
new MySet object
There is a singlenton instance
new Member
new MySet object
No singleton instance
New singleton:
new Member
new MySet object
There is a singlenton instance
new Member
new MySet object
There is a singlenton instance
I do not know why, but it creates two instances of the singleton. Does
anybody know why?
Regards
import myset
class Member:
def __init__ (self):
print "new Member"
self.name = "one member"
instance = myset.MySet ()
instance.add (self)
import member
class MySet:
"""MySet aplication"""
__instance = None
## Singleton instance
## This class implements all methods of MySet
class Singleton:
def __init__(self):
#Set the Glade file
print "New singleton:"
print self
self.members = {}
def add (self, member):
self.members[member.name] = member;
###
#
# MYSET DELEGATES EVERYTHING IN SINGLETON METHOD
#
###
def __init__( self ):
print "new MySet object"
if MySet.__instance is None:
print "No singleton instance"
MySet.__instance = MySet.Singleton()
else:
print "There is a singlenton instance"
self.__dict__['_EventHandler_instance'] = MySet.__instance
def __getattr__(self, aAttr):
return getattr(self.__instance, aAttr)
def __setattr__(self, aAttr, aValue):
return setattr(self.__instance, aAttr, aValue)
###
#
# MAIN CALL
#
###
if __name__ == "__main__":
print "Executing main"
set1 = MySet ()
set2 = MySet ()
mbr1 = member.Member ()
mbr2 = member.Member ()
mbr3 = member.Member ()
--
http://mail.python.org/mailman/listinfo/python-list
Re: Singleton implementation problems
Great! Thanks everyone for so many references and comments. Lots of doubts have been solved. On Fri, Jul 4, 2008 at 10:33 AM, Peter Otten <[EMAIL PROTECTED]> wrote: > Ben Finney wrote: > >> Peter Otten <[EMAIL PROTECTED]> writes: >> >>> The problem is the structure of your program. The myset module is >>> imported twice by Python, once as "myset" and once as "__main__". >> >> Yes, this is the problem. Each module imports the other. >> >>> Therefore you get two distinct MySet classes, and consequently two >>> distinct MySet.__instance class attributes. >> >> Are you sure? This goes against my understanding: that 'import foo' >> will not re-import a module that's already been imported, but will >> instead simply return the existing module. > > The main script is put into the sys.modules cache as "__main__", not under > the script's name. Therefore the cache lookup fails. > >> So, I think if one evaluated 'myset is __main__', you'd find they are >> exactly the same module under different names; and therefore that >> there is only *one* instance of 'MySet', again under two names. > > No: > > $ cat tmp.py > import tmp > import __main__ > > print tmp is __main__ > > $ python tmp.py > False > False > > Peter > -- > http://mail.python.org/mailman/listinfo/python-list > -- Saludos Juan Carlos "¡¡Viva lo rancio!!" -- http://mail.python.org/mailman/listinfo/python-list
