Python单例模式,附多种实现方案
在Python中实现单例模式,意味着一个类只能创建一个实例。单例模式在某些场景下非常有用,比如当你需要控制资源的访问,或者当你想确保全局只有一个对象实例时。下面是几种在Python中实现单例模式的方法:
1. 使用模块
Python的模块本身就是单例的,因为模块在第一次导入时初始化,之后的导入会直接使用已经加载的模块实例。因此,你可以简单地将你的单例对象作为模块级别的变量定义在一个模块中。
2. 使用__new__
方法
可以通过覆盖类的__new__
方法来确保只创建一个实例:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# 使用
singleton1 = Singleton()
singleton2 = Singleton()
# 检验
assert singleton1 is singleton2 # 为True,说明singleton1和singleton2是同一个实例
3. 使用装饰器
创建一个装饰器,用于装饰类,以确保只创建一个实例:
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class MyClass:
pass
# 使用
my_class1 = MyClass()
my_class2 = MyClass()
# 检验
assert my_class1 is my_class2 # 为True,说明my_class1和my_class2是同一个实例
4. 使用基类
创建一个单例基类,其他类通过继承这个基类来成为单例:
class SingletonBase:
_instances = {}
def __new__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(SingletonBase, cls).__new__(cls, *args, **kwargs)
return cls._instances[cls]
class MyClass(SingletonBase):
pass
# 使用
my_class1 = MyClass()
my_class2 = MyClass()
# 检验
assert my_class1 is my_class2 # 为True,说明my_class1和my_class2是同一个实例
这些方法各有特点,你可以根据自己的需求选择合适的实现方式。
转载自:https://juejin.cn/post/7343454968909004840