Spring Python (http://springpython.python-hosting.com) offers a
singleton solution. You can mark up function calls to only be called
the first time, i.e. as singletons. The results are cached inside the
Spring Python IoC container, so the next time the function is called,
it returns the cached copy. Prototypes bypass the caching, and instead
allow the function to be called everytime. This also support the idea
of prototype functions contain references to singleton objects.

from springpython.context import *

class MyContainer(DecoratorBasedApplicationContext):
   def __init__(self):
      DecoratorBasedAppicationContext.__init__(self)

   @component(scope.SINGLETON) # You can leave off the argument, since
scope.SINGLETON is the default)
   def singletonComponent(self):
      return ["There can be only one!"]

   @component(scope.PROTOTYPE):
   def prototypeComponent(self):
      return ["I think I'm a clone now. There's another one of me
always hangin' around!"]

if __name__ == "__main__":
   appContext = MyContainer()

   obj1 = appContext.singletonComponent()
   obj2 = appContext.singletonComponent()
   if obj1 == obj2:
      print "These are the same object"
   else:
      print "Something is wrong!"

   obj3 = appContext.prototypeComponent()
   obj4 = appContext.prototypeComponent()
   if obj1 != obj2:
      print "These are different instances of the function call."
   else:
      print "These shouldn't be the same!"

See also http://springpython.python-hosting.com/wiki/InversionOfControl
and 
http://springpython.python-hosting.com/wiki/DecoratorBasedApplicationContext.

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

Reply via email to