Python使用Decorator实现独身模式,pythondecorator,下面是要求独身的类定义,


下面是要求独身的类定义,它被@Singleton修饰

   @Singleton   class Foo:       def __init__(self):           print 'Foo created'   f = Foo() # Error, this isn't how you get the instance of a singleton   f = Foo.Instance() # Good. Being explicit is in line with the Python Zen   g = Foo.Instance() # Returns already created instance   print f is g # True

下面是Singleton的实现:

class Singleton:    """    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):        """        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()            return self._instance    def __call__(self):        raise TypeError('Singletons must be accessed through `Instance()`.')    def __instancecheck__(self, inst):        return isinstance(inst, self._decorated)

评论关闭