像素语言·跨维传送门实操手册:Hunyuan-MT-7B支持的33语种覆盖范围与典型用例解析
2026/4/11 8:47:02
单例模式是一种创建型设计模式,其核心目的是:确保一个类全局只有一个实例,并提供一个全局访问点来获取该实例。
常见应用场景:
Python 是动态语言,实现单例非常灵活。下面从简单到推荐依次介绍。
Python 模块本身就是天然的单例,所有导入模块的代码共享同一个实例。
# singleton.pyclass_Singleton:def__init__(self):print("Singleton created")defdo_something(self):print("Doing something...")instance=_Singleton()# 模块级实例,只创建一次# 在其他文件中使用# from singleton import instancefromsingletonimportinstanceprint(instance)# 同一个对象instance.do_something()优点:简单、无需额外代码、线程安全、天生单例
这是大多数 Python 项目中实际使用的“单例”方式。
__new__方法重写(经典方式)classSingleton:_instance=Nonedef__new__(cls,*args,**kwargs):ifcls._instanceisNone:cls._instance=super().__new__(cls)returncls._instancedef__init__(self):# 注意:__init__ 可能会被调用多次!# 如果需要初始化逻辑,要防止重复执行ifnothasattr(self,'_initialized'):print("Initializing singleton...")self._initialized=True# 测试s1=Singleton()s2=Singleton()print(s1iss2)# Trueprint(id(s1),id(s2))# 相同地址注意:__init__会被调用多次(每次实例化时),所以初始化逻辑要加保护。
defsingleton(cls):instances={}defget_instance(*args,**kwargs):ifclsnotininstances:instances[cls]=cls(*args,**kwargs)returninstances[cls]returnget_instance@singletonclassMyClass:def__init__(self,value):self.value=value# 使用a=MyClass(10)b=MyClass(20)print(aisb)# Trueprint(a.value)# 10(第一次传入的值生效,后续忽略)classSingletonMeta(type):_instances={}def__call__(cls,*args,**kwargs):ifclsnotincls._instances:instance=super().__call__(*args,**kwargs)cls._instances[cls]=instancereturncls._instances[cls]classDatabaseConnection(metaclass=SingletonMeta):def__init__(self):print("Connecting to database...")# 使用db1=DatabaseConnection()db2=DatabaseConnection()print(db1isdb2)# True如果在多线程环境中使用__new__方式,建议加锁避免竞争:
importthreadingclassThreadSafeSingleton:_instance=None_lock=threading.Lock()def__new__(cls,*args,**kwargs):ifcls._instanceisNone:withcls._lock:# 双重检查(Double-Checked Locking)ifcls._instanceisNone:cls._instance=super().__new__(cls)returncls._instance| 方式 | 推荐度 | 线程安全 | 简洁性 | 说明 |
|---|---|---|---|---|
| 模块导入 | ★★★★★ | 是 | 最高 | 最 Pythonic,强烈推荐 |
__new__重写 | ★★★★ | 需加锁 | 高 | 经典方式 |
| 装饰器 | ★★★ | 是 | 中 | 灵活但参数会被忽略 |
| 元类 | ★★ | 是 | 低 | 强大但复杂 |
| threading.Lock | ★★★ | 是 | 中 | 多线程必备 |
__new__或元类。如果你想看单例在实际项目中的应用(如日志器、配置中心),或者结合其他模式(如工厂+单例),可以告诉我!