You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现SingletonFactory按需创建底层为Blah的单例类

动态单例工厂实现方案

需求回顾

常见的单例基础实现参考如下:

class Klass:
    def __new__(cls, args):
        if not hasattr(cls, 'instance'):
            cls.instance = Blah(args)
        return cls.instance

需要实现按需生成单例类的工厂方法,满足以下调用效果:

SingletonFactory('Klass1')
obj11 = Klass1(args)
obj12 = Klass1(args)
# obj11 与 obj12 为同一个实例

SingletonFactory('Klass2')
obj21 = Klass2(args)
obj22 = Klass2(args)
# obj21 与 obj22 为同一个实例

# obj11 与 obj22 为不同实例

强制约束:所有动态生成的单例类,产出的实例底层实际类型必须为Blah。


完整实现代码

import sys

# 预先定义的底层业务类
class Blah:
    def __init__(self, args):
        self.args = args


def SingletonFactory(class_name: str):
    # 闭包独立存储当前类的单例实例,不同类互不干扰
    _instance = None

    def __new__(cls, *args, **kwargs):
        nonlocal _instance
        if _instance is None:
            _instance = Blah(*args, **kwargs)
        return _instance

    # 动态生成类
    new_cls = type(class_name, (), {"__new__": __new__})
    
    # 将生成的类注入调用方的全局作用域,支持直接按类名实例化
    frame = sys._getframe(1)
    frame.f_globals[class_name] = new_cls

效果验证

if __name__ == "__main__":
    test_args = {"key": "value"}

    SingletonFactory("Klass1")
    obj11 = Klass1(test_args)
    obj12 = Klass1(test_args)
    print(obj11 is obj12)       # 输出 True
    print(type(obj11))          # 输出 <class '__main__.Blah'>,符合底层类型要求

    SingletonFactory("Klass2")
    obj21 = Klass2(test_args)
    obj22 = Klass2(test_args)
    print(obj21 is obj22)       # 输出 True
    print(obj11 is obj22)       # 输出 False,不同单例类实例隔离

实现说明

  • 借助Python内置的type方法动态创建类,无需提前硬编码单例类,支持按需生成
  • 每个动态生成的类通过闭包维护独立的实例引用,从根源上避免不同单例类的实例冲突
  • 实例化时直接返回Blah类的实例,完全满足底层类型要求
  • 通过栈帧获取调用方的全局命名空间,注入生成的类,调用体验和原生定义类完全一致
  • 可选优化:如果需要避免重复创建同名类,可以在注入前增加判断,若全局命名空间已存在同名类直接返回即可。

内容的提问来源于stack exchange,提问作者sten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:36:18