Singleton suggestions requested

Chris Green cmg at uab.edu
Mon Apr 16 13:59:18 EDT 2001


I'm revisiting python after several years away and implementing a
medium sized project with it.  One of the first things I'm doing is
trying to get a few helper util functions working

After doing some websearches for OO Singleton implementations, I came
across http://www-md.fsl.noaa.gov/eft/developer/python/hints/ftul.html
which has Fredrik Lundh's code.

How would one improve upon this?  I'm still not fully in the python
mindset and I'd like to brainwash myself somemore before I get deep
into the project and realize I wanted better basics.

There's some testing code as well so it should be fairly
self-explanatory.

# Registry Singleton Ideas taken from Fredrik Lundh <Fredrik_Lundh at ivab.se>
#
# A Python Pattern: "Singleton/F"

class _SingletonRegistry:
    instance = None
    registry = {}

    def __init__(self):
        pass
    
    def getClass(self, Class, *args, **keywords):
        print "ARGS = " + str(args)
        print "class: " + str(Class)
        print "keywords: " + str(keywords)

        try:
            f = self.registry[Class]            
        except KeyError:
            self.registry[Class] = apply(Class, args, keywords)
            
        print "CLASS: " + str(self.registry[Class])
        return self.registry[Class]


def SingletonRegistry():
    """ Returns a SingletonRegistry reference, creating it if necessary """
    if not _SingletonRegistry.instance:
        _SingletonRegistry.instance = _SingletonRegistry()
        
    return _SingletonRegistry.instance


if __name__ == '__main__':
    class Foo:
        name = 'wee'

    class Bar:
        def __init__(self, *args):
            print "Bar.__init__ args: " + str(args)
            
    class Baz:
        def __init__(self, *args, **keywords):
            print "Bar.__init__ args: " + str(args)
            print "Baz.__init__ keywords: " + str(keywords)


    sr = SingletonRegistry()

    myFoo = sr.getClass(Foo)
    myFoo2 = sr.getClass(Foo)

    myBar = sr.getClass(Bar, "arg1", "arg2")
    myBar2 = sr.getClass(Bar, "arg1", "arg2")

    myBaz = sr.getClass(Baz, "arg1", "arg2", cheese=1, beer=2)
    myBaz2= sr.getClass(Baz, "arg1", "arg2", cheese=1, beer=2)

    print "myFoo  :" + str(myFoo)
    print "myFoo2 :" + str(myFoo2)
    print "myBar  :" + str(myBar)
    print "myBar2 :" + str(myBar2)
    print "myBaz  :" + str(myBaz)
    print "myBaz2 :" + str(myBaz2)

-- 
Chris Green <cmg at uab.edu>
You now have 14 minutes to reach minimum safe distance.



More information about the Python-list mailing list