|
@@ -1,40 +1,7 @@
|
|
|
-class Singleton:
|
|
|
- """
|
|
|
- (From Stackoverflow : http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-way-to-define-singletons-in-python)
|
|
|
+class Singleton(type):
|
|
|
+ _instances = {}
|
|
|
|
|
|
- A non-thread-safe helper class to ease implementing singletons.
|
|
|
- This should be used as a decorator -- not a metaclass -- to the
|
|
|
- class that should be a singleton.
|
|
|
-
|
|
|
- The decorated class can define one `__init__` function that
|
|
|
- takes only the `self` argument. Other than that, there are
|
|
|
- no restrictions that apply to the decorated class.
|
|
|
-
|
|
|
- To get the singleton instance, use the `Instance` method. Trying
|
|
|
- to use `__call__` will result in a `TypeError` being raised.
|
|
|
-
|
|
|
- Limitations: The decorated class cannot be inherited from.
|
|
|
-
|
|
|
- """
|
|
|
-
|
|
|
- def __init__(self, decorated):
|
|
|
- self._decorated = decorated
|
|
|
-
|
|
|
- def Instance(self, **kwargs):
|
|
|
- """
|
|
|
- Returns the singleton instance. Upon its first call, it creates a
|
|
|
- new instance of the decorated class and calls its `__init__` method.
|
|
|
- On all subsequent calls, the already created instance is returned.
|
|
|
-
|
|
|
- """
|
|
|
- try:
|
|
|
- return self._instance
|
|
|
- except AttributeError:
|
|
|
- self._instance = self._decorated(**kwargs)
|
|
|
- return self._instance
|
|
|
-
|
|
|
- def __call__(self):
|
|
|
- raise TypeError('Singletons must be accessed through `Instance()`.')
|
|
|
-
|
|
|
- def __instancecheck__(self, inst):
|
|
|
- return isinstance(inst, self._decorated)
|
|
|
+ def __call__(cls, *args, **kwargs):
|
|
|
+ if cls not in cls._instances:
|
|
|
+ cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
|
|
|
+ return cls._instances[cls]
|