Python实现单例(Singleton)的几种方法

单例是一种比较简单的设计模式,每次实例化只提供一个相同的实例对象,对于保证实例唯一和节约系统资源的时候十分有用,下面就看看python中实现单例的几种方法

使用__new__方法

因为在类的实例化过程中__new__方法会比__init__提前调用,我们在类属性中保存一个_singleton每次只返回这个。

class Singleton:
    def __new__(cls, *args, **kwargs):
        if not getattr(cls, '_singleton', None):
            cls._singleton = super().__new__(cls, *args, **kwargs)
        return cls._singleton


class MyClass(Singleton):
    pass

a = MyClass()
b = MyClass()
print(id(a))       # 4433117872
print(id(b))       # 4433117872
print(a is b)      # True

使用装饰器

from functools import wraps

def singleton(cls):
    _singleton = {}
    @wraps(cls)
    def wrapper(*args, **kwargs):
        if not _singleton.get(cls):
            _singleton[cls] = cls(*args, **kwargs)
        return _singleton[cls]
    return wrapper

@singleton
class MyClass:
    pass

利用装饰器中的_singleton变量存储所有类的实例

利用python模块

python模块(module)是天然的单例模式

# singleton.py

class Singleton:
    def foo(self):
        print("I'm singleton")

instance = Singleton()

del Singleton

然后利用模块导入

from single import instance

instance.foo()  # I'm singleton