如何实现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
相关产品推荐
相关产品推荐

