Python实现单例模式的三种常见方式解析

叶初
叶初
发布时间:2026-10-13| 6人浏览过
原创

本文详细解析Python中实现单例模式的三种主要方法:通过装饰器缓存实例、重写基类__new__方法以及利用元类控制类创建。每种方式均附有代码示例,帮助开发者理解不同场景下的最佳实践与实现细节。

使用装饰器实现单例

第一种实现方式是利用装饰器。

该装饰器内部维护一个名为instances的字典,用于缓存所有被标记为单例的类。当尝试创建单例实例时,若该类在字典中不存在则新建并缓存;若已存在,则直接返回缓存的实例对象。


def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2

使用基类__new__方法实现

第二种实现方式是基于基类。

__new__方法是Python中真正负责创建实例对象的底层机制。通过重写基类的__new__方法,可以确保在创建对象时仅生成一个实例,后续调用均返回该唯一实例。


class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

使用元类实现单例

第三种实现方式是利用元类。

元类(参考:深刻理解Python中的元类)是用于创建类对象的类。当类对象创建实例时,会调用元类的__call__方法。因此,在元类的__call__方法中控制逻辑,保证始终只创建一个实例即可。type是Python内置的一个元类,可作为参考基础。


class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class Foo(object):
__metaclass__ = Singleton
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

以上介绍了本文的核心内容,希望能为读者提供有益参考,也欢迎大家继续支持本站获取更多技术资讯。

相关标签:

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

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 算法库。