Python中的单例实现
在Python中实现单例有多种方法,比如通过工厂方法或装饰器控制对象实例的生成、通过类的__new__
方法控制对象构造过程,通过元类控制类的生成等,以下记录了这几种方法的实现(均不考虑线程安全)。
-
通过工厂函数
class _Foo(): pass _foo_instance = None def Foo(): global _foo_instance if not _foo_instance: _foo_instance = _Foo() return _foo_instance A = Foo() B = Foo() print(A is B)
-
通过装饰器函数,此方法与工厂函数本质是一样的
from functools import wraps def singleton(cls): _instance = None @wraps(cls) def wrapper(*args, **kwargs): nonlocal _instance if not _instance: _instance = cls(*args, **kwargs) return _instance return wrapper @singleton class Foo(): pass
-
装饰器类
```py class Singleton(): def init(self, cls): self._instance = None self._cls = cls
def __call__(self, *args, **kwargs): if not self._instance: self._instance = self._cls(*args, **kwargs) return self._instance
@Singleton class Foo(): pass ```
-
__new__
控制构造过程。对象从类中创建的时候,先执行的__new__
返回对象实例,再通过__init__
初始化。class Foo(): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance
-
通过元类控制类的生成。Python是动态语言,可以通过metaclass等手段动态生成类。
class Singleton(type): _instance = None def __call__(cls, *args, **kwargs): if not cls._instance: cls._instance = super().__call__(*args, **kwargs) return cls._instance class Foo(metaclass=Singleton): pass
[参考文档] 使用元类 如何正确理解Python函数是第一类对象 一步一步教你认识Python闭包 python—类对象和实例对象的区别 Python单例模式(Singleton)的N种实现