基于Python实现单例模式

目录

1、使用装饰器实现

2、使用__new__方法实现

单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景中都非常有用,以下是单例模式的一些常见应用场景:

  1. 应用程序的日志应用:日志记录通常需要一个全局共享的日志对象,以便于追加日志内容。使用单例模式可以确保在整个应用程序中只有一个日志对象实例。
  2. 数据库连接池:数据库连接是昂贵的资源,频繁地创建和销毁连接会导致性能问题。通过单例模式,可以确保数据库连接池只有一个实例,从而有效地管理和复用数据库连接。
  3. 多线程的线程池:线程池用于管理和复用线程,以避免频繁地创建和销毁线程。使用单例模式可以确保线程池只有一个实例,从而方便地对池中的线程进行控制和管理。
  4. 全局配置对象:在Web应用中,配置对象通常是共享的,需要确保在整个应用程序中只有一个实例。使用单例模式可以方便地读取和更新全局配置对象。

1、使用装饰器实现

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:
    def __init__(self, val):
        self.val = val


# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b)  # 输出:True

2、使用__new__方法实现

通过重写类的 __new__ 方法,可以控制实例的创建。

python 复制代码
class Singleton:
    _instance = None

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


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


# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b)  # 输出:True

在这个例子中,Singleton 类是一个基类,它确保所有继承自它的类都是单例的。

相关推荐
〖是♂我〗14 分钟前
自定义数据集 使用scikit-learn中svm的包实现svm分类
开发语言·python
抱抱宝44 分钟前
Pyecharts之特殊图表的独特展示
python·信息可视化·数据分析
deephub1 小时前
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
python·机器学习·gil
MatpyMaster2 小时前
基于PyQt5打造的实用工具——PDF文件加图片水印,可调大小位置,可批量处理!
python·pdf
go54631584652 小时前
python 从知网的期刊导航页面抓取与农业科技相关的数据
开发语言·python·科技
米码收割机3 小时前
【python】tkinter实现音乐播放器(源码+音频文件)【独一无二】
开发语言·python·pygame
星如雨グッ!(๑•̀ㅂ•́)و✧3 小时前
Java NIO全面详解
java·python·nio
笛柳戏初雪3 小时前
Python中的函数(下)
开发语言·python
码界筑梦坊3 小时前
基于Django的个人博客系统的设计与实现
后端·python·django·毕业设计