问题描述:
在开发过程中,有一些时候我们出现如下需求。如,某个服务器程序的配置信息存放在一个文件中,程序运行中多个地方需要调用修改该文件,或者在web开发中,手写orm系统。我们也可以用单例模式来控制数据库对象的生成。
解决方案一
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
解决方案二
我们知道,装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例,代码如下:
def singleton(cls, *args, **kwargs):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton
@singleton
class CMySQL():
pass