【补充】Python中实现单例模式的六种常见方法

【补充】Python中实现单例模式的六种常见方法

【1】类属性:

class Singleton:
    instance = None
    
    @classmethod
    def getInstance(cls):
        if cls.instance is None:
            cls.instance = Singleton()
        return cls.instance
  • 使用类属性保存实例,通过类方法获取实例。
  • 在第一次调用getInstance方法时创建实例,并在后续调用中直接返回该实例。

【2】装饰器:

def singleton(cls):
    instances = {}
    
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    
    return wrapper

@singleton
class Singleton:
    pass
  • 使用装饰器将原来的类包装成一个新的类,通过闭包和字典保存实例。
  • 在每次实例化时,先检查字典中是否已经存在该类的实例,如果不存在才创建实例并返回。

【3】元类:

class SingletonType(type):
    def __init__(cls, name, bases, attrs):
        super(SingletonType, cls).__init__(name, bases, attrs)
        cls.instance = None
    
    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super(SingletonType, cls).__call__(*args, **kwargs)
        return cls.instance

class Singleton(metaclass=SingletonType):
    pass
  • 定义一个元类,在元类的__call__方法中判断实例是否已存在,如果不存在则调用父类的__call__方法来创建并返回实例。

【4】基于__new__方法:

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls)
        return cls._instance
  • 重写__new__方法,在实例化对象时判断类中是否已有实例,如果没有则调用父类的__new__方法来创建并返回。

【5】基于__init__方法:

class Singleton(object):
    _instance = None
    
    def __init__(self):
        if self._instance is None:
            self._instance = self
        else:
            raise Exception("Singleton instance already exists")
  • __init__方法中判断是否已有实例,如果没有则将当前实例赋值给类的类属性_instance,否则抛出异常。

【6】基于模块:

# singleton.py
class Singleton:
    pass

singleton_instance = Singleton()
  • 将实例化操作放在模块级别,通过导入该模块来获取实例。
  • 由于Python模块在运行时只会被导入一次,因此保证了实例的单一性。
posted @ 2023-08-19 17:36  Chimengmeng  阅读(40)  评论(0编辑  收藏  举报