【补充】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模块在运行时只会被导入一次,因此保证了实例的单一性。
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17642787.html