当前位置: 首页 > article >正文

Python 单例模式笔记

一、什么是单例模式

单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这种模式通常用于需要控制对某些资源的访问的场景,例如数据库连接、配置管理等。

二、单例模式的特点

  1. 唯一性: 单例模式确保一个类只有一个实例。无论在程序的哪个地方请求该类的实例,返回的都是同一个对象。

  2. 全局访问: 提供一个全局访问点,允许其他对象或类访问该实例。

  3. 延迟初始化: 单例模式通常会在第一次访问时创建实例,而不是在程序启动时就创建。

三、单例模式的实现

3.1 使用类变量

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

# 使用示例
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2)  # 输出: True,两个变量指向同一个实例

3.2 使用装饰器

还可以使用装饰器来实现单例模式:

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 Singleton:
    pass

# 使用示例
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2)  # 输出: True

3.3 使用模块

在 Python 中,模块本身就是单例的。可以将需要共享的状态或数据放在一个模块中,其他模块可以直接导入并使用。

# my_module.py
shared_variable = 0

def increment():
    global shared_variable
    shared_variable += 1
# main.py
import my_module

my_module.increment()
print(my_module.shared_variable)  # 输出: 1

四、单例模式的应用场景

  • 配置管理: 在应用程序中,通常只需要一个配置管理器来读取和存储配置数据。
  • 日志记录: 只需一个日志记录器实例来处理所有的日志记录请求。
  • 数据库连接: 在应用程序中,通常只需要一个数据库连接池实例来管理数据库连接。

五、Python 单例模式在开发中的作用

在软件开发中,单例模式可以帮助我们管理共享资源,确保在整个应用程序中只有一个实例存在。接下来,将通过一个稍微复杂一点的程序项目来说明单例模式的作用。

假设我们正在开发一个简单的日志记录系统,该系统需要在整个应用程序中共享一个日志记录器实例。我们希望确保所有模块都使用同一个日志记录器,以便集中管理日志输出。

5.1 定义日志记录器类

我们将创建一个 Logger 类,使用单例模式确保只有一个日志记录器实例。该类将提供记录日志的功能,并将日志输出到文件中。

import os
import logging

class Logger:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(Logger, cls).__new__(cls)
            cls._instance._initialize_logger()
        return cls._instance

    def _initialize_logger(self):
        log_dir = 'logs'
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)

        log_file = os.path.join(log_dir, 'app.log')
        self.logger = logging.getLogger('AppLogger')
        self.logger.setLevel(logging.DEBUG)

        file_handler = logging.FileHandler(log_file)
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(formatter)
        self.logger.addHandler(file_handler)

    def log(self, message):
        self.logger.debug(message)

# 使用示例
logger1 = Logger()
logger1.log("This is a log message from logger1.")

logger2 = Logger()
logger2.log("This is a log message from logger2.")

print(logger1 is logger2)  # 输出: True,两个变量指向同一个实例

5.2 使用日志记录器

在项目的其他模块中,我们可以直接使用 Logger 类来记录日志,而不需要担心创建多个实例。

# module_a.py
from logger import Logger

def function_a():
    logger = Logger()
    logger.log("Function A is called.")

# module_b.py
from logger import Logger

def function_b():
    logger = Logger()
    logger.log("Function B is called.")

# main.py
from module_a import function_a
from module_b import function_b

function_a()
function_b()

5.3 运行程序

当您运行 main.py 时,您将看到所有日志消息都被写入同一个日志文件 app.log 中。无论是从 function_a 还是 function_b 记录的日志,都会集中在同一个日志记录器实例中。

5.4 单例模式的作用

  • 资源共享: 通过单例模式,我们确保了日志记录器在整个应用程序中只有一个实例,避免了资源的浪费。
  • 集中管理: 所有日志记录都通过同一个实例进行管理,便于维护和查看。
  • 一致性: 由于所有模块都使用同一个日志记录器,日志输出的一致性得以保证,便于调试和分析。

http://www.kler.cn/a/556710.html

相关文章:

  • HarmonyOS NEXT 开发者进阶指南(基于API 12+理论解析)
  • 《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO
  • 如何优化Spark作业的性能
  • 网络通信中的TCP三次握手与四次挥手:新手小白的入门指南
  • OpenHarmony AI业务子系统
  • ncDLRES:一种基于动态LSTM和ResNet的非编码RNA家族预测新方法
  • 【git】合并多个提交记录
  • 【C/C++】合并两个有序链表 (leetcode T21)
  • 【ELK】【Elasticsearch】数据查询方式
  • 排序与算法:插入排序
  • EasyRTC:基于WebRTC与P2P技术,开启智能硬件音视频交互的全新时代
  • 安全面试1
  • 【Python】打造自己的HTTP server
  • OpenGauss MySQL兼容库迁移
  • Java 中 HTTP 协议版本使用情况剖析
  • 【QT 网络编程】HTTP协议(二)
  • SQLMesh 系列教程6- 详解 Python 模型
  • 物联网与大数据:揭秘万物互联的新纪元
  • (网络安全)渗透测试
  • 想象一个AI保姆机器人使用场景分析