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是同一个实例

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

相关推荐
jay神9 分钟前
2026年YOLO还有哪些创新点可以做?
python·yolo·毕业设计·科研·课程设计·创新
傲笑风9 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架9 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
谢白羽13 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
迷迭香yy13 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
清水白石00814 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
️学习的小王14 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
前端 贾公子14 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步14 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
jayson.h15 小时前
PDF 合并+添加页码 相关库、类、函数
开发语言·前端·python