Python实现单例模式的5种方法

下面是 Python 实现单例模式的 5 种方法的详细攻略。

什么是单例模式?

单例模式是一种常见的设计模式,它保证一个类只能创建一个实例,并提供一个全局访问该实例的方式。

Python 实现单例模式的 5 种方法

方法一:使用模块

Python 中的模块加载是线程安全的,因此将实例化代码放在模块级别的变量中,可以保证只有一个实例会被创建。

# singleton.py

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls)
        return cls._instance

这种方法需要将所有的单例类代码放在一个模块中,然后使用模块导入来获得单例对象。例如:

from singleton import Singleton

singleton = Singleton()

方法二:使用装饰器

使用装饰器将实例化代码封装在闭包中,然后用一个字典变量存储闭包对象和单例对象的对应关系,保证每个类只有一个实例对象。

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(object):
    pass

方法三:使用元类

Python 中的类也是对象,因此可以使用元类来实现单例模式。元类是类的类,可以用来控制类的创建过程和行为。

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__call__(*args, **kwargs)
        return cls._instance

class MyClass(metaclass=Singleton):
    pass

方法四:使用基类

将单例模式的实现封装到一个基类中,并在每个需要单例模式的类中继承该基类。

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

class MyClass(Singleton):
    pass

方法五:使用模板方法

使用模板方法模式将单例模式封装到一个基类中,并在每个子类中实现模板方法。

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

class MyClass(Singleton):
    def __init__(self, arg):
        self.arg = arg

    @classmethod
    def create_singleton(cls, arg):
        if not cls._instance:
            cls._instance = cls(arg)
        return cls._instance

这种方法需要子类实现一个静态方法或类方法来创建单例对象,例如:

my_object = MyClass.create_singleton('argument')

示例说明

下面我们来看两个关于单例模式的示例。

示例一:程序日志

在一个程序中,我们通常需要记录一些日志信息,而记录日志的类只需要一个实例即可。因此可以使用单例模式来实现日志记录类。

import logging

class SingletonLogger(object):
    _instance = None

    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
            cls._instance.logger = logging.getLogger(__name__)
        return cls._instance

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

在其他模块中使用 Logger 对象时,只需要导入 SingletonLogger 类并调用 log 方法即可。

from singleton_logger import SingletonLogger

logger = SingletonLogger()
logger.log('Logging message')

示例二:数据库连接池

在 Web 应用开发中,为了提高数据库访问效率,我们通常会使用连接池来管理数据库连接。连接池只需要一个实例即可,可以使用单例模式来实现。

import MySQLdb
from dbutils.pooled_db import PooledDB

class SingletonDatabase(object):
    _instance = None

    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
            cls._instance.pool = PooledDB(
                creator=MySQLdb,
                use_unicode=True,
                db='test',
                user='user',
                password='password',
                host='localhost',
                port=3306,
                charset='utf8mb4',
                maxconnections=100,
                blocking=True
            )
        return cls._instance

    def get_connection(self):
        return self.pool.connection()

    def close_connection(self, conn):
        conn.close()

在其他模块中使用数据库连接池时,只需要导入 SingletonDatabase 类并调用 get_connection 方法获取数据库连接即可。

from singleton_database import SingletonDatabase

db = SingletonDatabase()
conn = db.get_connection()
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
db.close_connection(conn)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现单例模式的5种方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python编程开发之类型转换convert实例分析

    Python编程开发之类型转换convert实例分析 在Python编程中,类型转换是一项常见的操作,主要包括将不同类型的值转换为相同类型、将一种类型的值转换为另一种类型等。在本文中,我们将分析Python中常见的类型转换方法,并提供两个实例说明。 常见的类型转换方法 1. int() 将字符串或浮点数转换为整数。 示例: str_num = "1…

    python 2023年6月6日
    00
  • python 实现全球IP归属地查询工具

    Python 实现全球IP归属地查询工具 前言 全球IP归属地查询工具是一个通过IP地址查询该IP地址所对应的地理位置的工具。在网络安全领域有着重要的应用,比如通过归属地查询来防止恶意攻击等。 准备工作 为了实现这个功能,我们需要使用到Python的第三方库pygeoip,这个库可以从IP地址中提取有价值的信息并且根据该IP地址获取该地址的归属地。我们可以使…

    python 2023年5月18日
    00
  • C++基础概念讲述

    C++基础概念讲述 数据类型 C++ 中包含了基本数据类型,例如整数和浮点数。某些情况下,我们需要更加复杂的数据类型,例如字符串和数组。以下是一些基本的数据类型: int // 整数型数据类型 float // 单精度浮点数类型 double // 双精度浮点数类型 char // 字符型数据类型 bool // 布尔型数据类型 变量 C++ 中,变量是指一…

    python 2023年5月14日
    00
  • Python守护进程用法实例分析

    Python守护进程用法实例分析 什么是守护进程? 守护进程是在系统中后台运行的进程。它们的特点是不需要控制终端且不能由终端终止。通常,守护进程是作为系统服务进行启动并一直运行的。在 Python 中,可以通过 daemon 参数来设置一个进程为守护进程。 守护进程的用法 创建守护进程 Python 的标准库提供了 daemonize 模块来创建守护进程。下…

    python 2023年6月3日
    00
  • 利用python中集合的唯一性实现去重

    利用Python中集合的唯一性实现去重 在Python中,集合(set)是一种无序且元素唯一的数据类型。因此,可以利用集合的唯一性来实现去重操作。本攻略将详细介绍如何利用Python中集合的唯一性实现去重,包括集合的定义、创建、去重操作等内容。 集合的定义和创建 在Python中,可以使用花括号或set()函数来定义和创建一个集合。以下是一些示例代码: # …

    python 2023年5月13日
    00
  • 简单了解如何封装自己的Python包

    当我们在编写 Python 应用程序时,可能需要使用一些重复使用的代码或工具函数。封装这些功能并将它们存储在一个自己的 Python 包中是一个不错的方法,可以提高代码的可重用性和可维护性。 以下是封装自己的 Python 包的完整攻略: 步骤一:创建 Python 包 创建一个新的目录,它将成为你的 Python 包的根目录。 在根目录中创建一个名为 in…

    python 2023年5月14日
    00
  • 利用Chatgpt开发一款加减乘除计算器(Python代码实现)

    利用ChatGPT开发一款加减乘除计算器 简介 ChatGPT是一个基于Transformer模型的聊天机器人框架,可以轻松实现自然语言生成、聊天机器人等功能。本文将基于ChatGPT框架,实现一个简单的加减乘除计算器。 步骤 安装依赖 在终端中运行以下命令安装所需依赖: pip install torch transformers 构建模型 首先,需要从t…

    python 2023年6月13日
    00
  • 利用python实现逐步回归

    以下是关于“利用Python实现逐步回归”的完整攻略: 简介 逐步回归是一种特征选择技术,它通过逐步添加或删除特征来构建一个模型。在这个过程中,每次添加或删除一个特征,都会重新计算模型的误差,以确定哪个特征对模型的影响最大。本教程将介绍如何使用Python实现逐步回归,并讨论如何使用该技术来选择最佳特征集。 步骤 1.导入数据 首先,我们需要导入数据。可以使…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部