前言:一些资源管理器常常设计成单例模式:类,可以用类生出多个变量,可有些场景不需要多个变量,项目比较大。比如配置文件,全局都只要一份配置,可在代码多次用并且不需要多次new对象,一个类只需要一个对象,就需要使用单例了。
一、采用修饰器实现单例模式,修饰器的第一个参数应该是被修饰的类,可以采用字典来存储类实例,类作为key,实例作为值。
def singleton(cls, *args, **kwargs): _instance = {} def get_instance(): if cls not in _instance: _instance[cls] = cls(*args, **kwargs) return _instance[cls] return get_instance @singleton class Singleton(): pass sln1 = Singleton() sln2 = Singleton() print(id(sln1)) print(id(sln2)) output: sln1=11076560 sln2=11076560
二、类模式实现单例的关键在于构造器,__new__里控制类只被实例化一次,可以通过类属性保存类实例,判断类属性是否存在,不存在则实例化对象并赋值
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance sing1 = Singleton() sing2 = Singleton() print(id(sing1)) print(id(sing2))
output: sing1=18743952 sing2=18743952