Flask框架中单例模式的四种实现方式详解

Owen
Owen
发布时间:2026-10-13| 3人浏览过
原创

本文详细解析在Flask框架下实现单例模式的四种方法:文件导入、类封装、__new__魔法方法及元类机制。重点对比了各方式在多线程环境下的表现,提供了支持线程安全的代码示例,帮助开发者根据实际需求选择最优方案。

Flask单例模式概述

本文介绍Flask框架中单例模式的几种常见实现方案,供开发者参考。

单例模式定义:

该模式确保一个类在整个程序运行期间仅生成一个实例,从而避免对同一资源产生冲突的访问请求。

例如,Django admin.py中的admin.site.register(),其中的site对象即是通过文件导入方式实现的单例模式。

单例模式的四种实现方式

在Python中,创建单例模式主要有以下4种方式:

  • 1. 文件导入方式
  • 2. 类封装方式
  • 3. 基于__new__方法实现
  • 4. 基于元类(metaclass)方式实现

文件导入方式

第一种方式:文件导入

核心逻辑位于single.py文件中。


class Singleton():
  def __init__(self):
    pass
site = Singleton()

其原理类似于标准库模块的导入机制:

当第一次执行import time时,time模块被加载并驻留内存;第二次再次import time时,Python解释器会直接从内存中获取已存在的模块,而不会重新创建。

在app.py中引入该模块。


from single.py import site #第一次导入,实例化site对象并放入内存

在views.py中调用该模块中的对象。


from single.py import site #第二次导入,直接从内存拿。

类封装方式

第二种方式:类封装方式

这种方式的主要缺点在于它改变了传统的单例创建语法,导致代码风格不一致。


obj = Singleton.instance()


# 单例模式:无法支持多线程情况
import time
class Singleton(object):
  def __init__(self):
    import time
    time.sleep(1)
  @classmethod
  def instance(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
      Singleton._instance = Singleton(*args, **kwargs)
    return Singleton._instance
# # 单例模式:支持多线程情况
import time
import threading
class Singleton(object):
  _instance_lock = threading.Lock()
  def __init__(self):
    time.sleep(1)
  @classmethod
  def instance(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
      with Singleton._instance_lock:
        if not hasattr(Singleton, "_instance"):
          Singleton._instance = Singleton(*args, **kwargs)
    return Singleton._instance

基于__new__方法实现

第三种方式:基于__new__方法实现

具体的单例创建逻辑如下:


obj1 = Singleton()
obj2 = Singleton()


import time
import threading
class Singleton(object):
  _instance_lock = threading.Lock()
  def __init__(self):
    pass
  def __new__(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
      with Singleton._instance_lock:
        if not hasattr(Singleton, "_instance"):
          Singleton._instance = object.__new__(cls, *args, **kwargs)
    return Singleton._instance

基于元类方式实现

第四种方式:基于元类(metaclass)方式实现

该方式的核心原理涉及Python的对象与类创建机制:

  • 1. 普通对象由类创建,实例化时自动执行类的__init__方法,而调用类本身(即创建对象)时执行类的__call__方法。
  • 2. 类本身由type创建,定义类时自动执行type的__init__方法,而调用类名(即实例化)时执行type的__call__方法。

基于元类的单例创建方式如下:


obj1 = Foo()
obj2 = Foo()


import threading
class SingletonType(type):
  _instance_lock = threading.Lock()
  def __call__(cls, *args, **kwargs):
    if not hasattr(cls, "_instance"):
      with SingletonType._instance_lock:
        if not hasattr(cls, "_instance"):
          cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
    return cls._instance
class Foo(metaclass=SingletonType):
  def __init__(self):
    pass

希望上述关于Flask框架下Python程序设计的单例模式详解能对大家有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。