python单例模式

单例模式(Singleton Pattern)是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这个模式通常用于那些需要在整个应用程序中共享一个公共资源的情况,例如日志记录器、数据库连接、线程池等。

单例模式的主要特点包括:

单一实例:一个类只能有一个实例存在。

全局访问点:提供一个公共的访问点,允许其他对象在程序中访问这个单例实例。

在 Python 中实现单例模式的方法有多种,以下是其中两种常见的方式:

1. 使用模块级别的变量

通过模块的方式实现单例模式是 Python 中最简单的方式之一,因为 Python 的模块在程序生命周期内只会被加载一次,所以模块级别的变量也只会被创建一次。

python

Copy code

python 复制代码
# singleton.py

class Singleton:
    def __init__(self):
        # 初始化代码
        pass

# 创建单例实例
singleton_instance = Singleton()

其他模块可以直接导入这个模块,并访问其中的 singleton_instance,这样就可以得到单例的实例了:

python 复制代码
# other_module.py

from singleton import singleton_instance

# 使用单例实例
print(singleton_instance)

2. 使用装饰器(Decorator)

另一种常见的方式是使用装饰器来确保一个类只有一个实例。下面是一个简单的装饰器实现单例模式的示例:

python 复制代码
# 定义一个装饰器 singleton,用于实现单例模式
def singleton(cls):
    # 创建一个字典用于存储单例实例
    instances = {}

    # 定义一个内部函数,用于获取单例实例
    def get_instance(*args, **kwargs):
        # 检查类是否已经在 instances 字典中
        if cls not in instances:
            # 如果不存在,则创建一个新的实例并存储在 instances 中
            instances[cls] = cls(*args, **kwargs)
        # 返回类的单例实例
        return instances[cls]

    # 返回内部函数作为装饰器
    return get_instance

# 使用装饰器 singleton 来装饰 Logger 类,使其成为单例模式
@singleton
class Logger:
    def __init__(self):
        # 初始化代码,这里可以添加日志记录器的初始化逻辑
        pass

# 使用单例实例
# 当第一次创建 Logger 实例时,会调用装饰器内部的 get_instance 函数,
# 在此之后,再次创建 Logger 实例时将直接返回第一次创建的实例
logger = Logger()

这里定义了一个 singleton 装饰器,它可以用来装饰一个类。装饰后的类在实例化时,会检查是否已经存在实例,如果存在则直接返回,如果不存在则创建新实例并返回。

无论是哪种方式,单例模式都可以确保在整个应用程序中只有一个实例存在,并且可以通过全局访问点方便地访问到这个实例。

相关推荐
Escalating_xu4 分钟前
C++11 彻底吃透 emplace_back 与 push_back(最全闭环:左右值|深浅拷贝|移动构造|万能引用|完美转发)
开发语言·c++
正和视觉教育9 分钟前
深圳CCD视觉培训:快速掌握机器视觉检测核心技术
人工智能·python·计算机视觉·视觉检测
axinawang9 分钟前
第16课:编码、解码、转义字符、转义序列、输出格式化
python
不会计算机的g_c__b15 分钟前
Python + OpenCV 实现文档扫描与OCR识别系统
python·opencv·ocr
梦想不只是梦与想19 分钟前
Python 中的 reduce 函数:累积计算
python·reduce
唐山泽际科技26 分钟前
2026年本地生活服务(如餐饮、美业)怎样借助LBS(地理位置)精准获客?
python·智能手机·生活
金銀銅鐵36 分钟前
[Python] 用 Pillow 来绘制北欧五国的国旗
python
皓月斯语37 分钟前
B3865 [GESP202309 二级] 小杨的 X 字矩阵 题解
开发语言·c++·矩阵·题解
Allen_LVyingbo1 小时前
基于结构化电子病历的临床风险预测模型构建与大模型协同优化
python·安全·机器学习·docker·vim·健康医疗
paeamecium2 小时前
【PAT甲级真题】- Rational Sum (20)
数据结构·c++·python·算法·pat考试·pat