Python 实现单例模式的完整指南:从基础到优化

小石头
小石头
发布时间:2026-10-16 | 5人浏览过
原创

本文详细介绍 Python 中单例模式的两种核心实现方式。首先通过重写 __new__ 方法确保类仅创建唯一实例,解决对象引用问题;随后针对初始化方法重复调用的痛点,引入类属性标记机制,实现初始化逻辑仅执行一次。文章包含完整代码示例,帮助开发者掌握高效、安全的单例模式编写技巧。

单例模式基础实现

单例模式的核心目标是确保一个类在系统中始终只存在一个实例对象。

  • 第一步,定义一个类属性,初始值设为 None,用于存储该单例对象的引用。
  • 第二步,重写类的 __new__ 方法。
  • 第三步,在 __new__ 中检查类属性是否为 None。如果是,则调用父类的 __new__ 方法分配内存空间,并将返回的对象引用赋值给类属性。
  • 第四步,返回类属性中保存的对象引用。

class MusicPlayer(object):

    # 记录第一个被创建对象的引用
    instance = None

    def __new__(cls, *args, **kwargs):

        # 判断类属性是否是空对象
        if cls.instance is None:

            # 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 返回类属性保存的对象引用
        return cls.instance

# 创建多个对象
play1 = MusicPlayer()
print(play1)

play2 = MusicPlayer()
print(play2)

解决初始化方法重复调用问题

在 Python 中,每次使用类名() 创建对象时,解释器会自动执行两个步骤:

  • 首先调用 __new__ 方法分配内存空间;
  • 接着调用 __init__ 方法进行对象初始化。

仅重写 __new__ 方法虽然能保证每次获取的是同一个对象引用,但 __init__ 初始化方法仍会被多次调用,这可能导致资源浪费或状态异常。

因此,我们需要确保初始化动作仅执行一次。

解决方案如下:

  • 定义一个类属性 _init_flag,初始值为 False,用于标记初始化动作是否已执行。
  • 在 __init__ 方法中判断 _init_flag 的值。如果为 False,说明尚未初始化,则执行具体的初始化逻辑。
  • 执行完初始化后,将 _init_flag 设置为 True。
  • 这样,后续再次自动调用 __init__ 时,由于 _init_flag 已为 True,初始化逻辑将不再执行,从而保证初始化只发生一次。
class MusicPlayer(object):

    # 记录第一个被创建对象的引用
    instance = None

    # 记录是否执行过初始化动作
    init_flag = False

    def __new__(cls, *args, **kwargs):

        # 判断类属性是否是空对象
        if cls.instance is None:

            # 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 返回类属性保存的对象引用
        return cls.instance

    def __init__(self):
        # 判断是否执行过初始化动作
        if MusicPlayer.init_flag:
            return
        # 如果没有执行过,在执行初始化动作
        print("初始化播放器")
        # 修改类属性的标记
        MusicPlayer.init_flag = True

# 创建多个对象
play1 = MusicPlayer()
print(play1)

play2 = MusicPlayer()
print(play2)

至此,我们完成了 Python 单例模式的完整实现与优化。更多关于 Python 设计模式的内容,欢迎查阅本站其他文章或持续关注后续更新。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表