Python单例模式,附多种实现方案

在Python中实现单例模式,意味着一个类只能创建一个实例。单例模式在某些场景下非常有用,比如当你需要控制资源的访问,或者当你想确保全局只有一个对象实例时。下面是几种在Python中实现单例模式的方法:

1. 使用模块

Python的模块本身就是单例的,因为模块在第一次导入时初始化,之后的导入会直接使用已经加载的模块实例。因此,你可以简单地将你的单例对象作为模块级别的变量定义在一个模块中。

2. 使用__new__方法

可以通过覆盖类的__new__方法来确保只创建一个实例:

python 复制代码
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. 使用装饰器

创建一个装饰器,用于装饰类,以确保只创建一个实例:

python 复制代码
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. 使用基类

创建一个单例基类,其他类通过继承这个基类来成为单例:

python 复制代码
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是同一个实例

这些方法各有特点,你可以根据自己的需求选择合适的实现方式。

相关推荐
belldeep3 小时前
python:genesis-world, Genesis-Embodied-AI
人工智能·python·ai·genesis
benchmark_cc4 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
维克兜率天5 小时前
【维克】趋势型CTA:期货市场的“追涨杀跌“
人工智能·python
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
梦想不只是梦与想6 小时前
PyTorch、CPU、GPU、CUDA
人工智能·pytorch·python·深度学习·机器学习·cuda
数字融合6 小时前
透明化视频孪生危化安全管控解决方案
人工智能·python·安全
别问!问就是全会7 小时前
Jupyter Notebook 安装包下载|单元格分块运行,图表直接内嵌
ide·python·其他·jupyter
深蓝AI8 小时前
Python 缓存击穿实测:16 个并发请求如何只回源 1 次
python
benchmark_cc8 小时前
用 00700.HK 做港股行情清洗:字段核对、校验与个人量化开发实践
python·数据分析·pandas·量化交易·股票数据·quantdash
zh路西法8 小时前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace