Flask框架单例模式实现方法详解
本文实例讲述了Flask框架单例模式实现方法。分享给大家供大家参考,具体如下:
单例模式:
程序运行时只能生成一个实例,避免对同一资源产生冲突的访问请求。
Django admin.py下的admin.site.register(), site就是使用文件导入方式的单例模式
创建到单例模式4种方式:
- 1.文件导入
- 2.类方式
- 3.基于__new__方式实现
- 4.基于metaclass方式实现
1.文件导入:
in single.py
classSingleton(): def__init__(self): pass site=Singleton()
类似:
importtime 第一次已经把导入的time模块,放入内存
importtime 第二次内存已有就不导入了
in app.py
fromsingle.pyimportsite#第一次导入,实例化site对象并放入内存
in views.py
fromsingle.pyimportsite#第二次导入,直接从内存拿。
2.类方式:
缺点:改变了单例的创建方式
obj=Singleton.instance()
#单例模式:无法支持多线程情况 importtime classSingleton(object): def__init__(self): importtime time.sleep(1) @classmethod definstance(cls,*args,**kwargs): ifnothasattr(Singleton,"_instance"): Singleton._instance=Singleton(*args,**kwargs) returnSingleton._instance ##单例模式:支持多线程情况 importtime importthreading classSingleton(object): _instance_lock=threading.Lock() def__init__(self): time.sleep(1) @classmethod definstance(cls,*args,**kwargs): ifnothasattr(Singleton,"_instance"): withSingleton._instance_lock: ifnothasattr(Singleton,"_instance"): Singleton._instance=Singleton(*args,**kwargs) returnSingleton._instance
3.基于__new__方式实现:
单例创建方式:
obj1=Singleton() obj2=Singleton()
importtime importthreading classSingleton(object): _instance_lock=threading.Lock() def__init__(self): pass def__new__(cls,*args,**kwargs): ifnothasattr(Singleton,"_instance"): withSingleton._instance_lock: ifnothasattr(Singleton,"_instance"): Singleton._instance=object.__new__(cls,*args,**kwargs) returnSingleton._instance
4.基于metaclass方式实现
基于metaclass方式实现的原理:
- 1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的__call__方法
- 2.类是type创建,创建类时候type的__init__方法自动执行,类()执行type的__call__方法
单例创建方式:
obj1=Foo() obj2=Foo()
importthreading classSingletonType(type): _instance_lock=threading.Lock() def__call__(cls,*args,**kwargs): ifnothasattr(cls,"_instance"): withSingletonType._instance_lock: ifnothasattr(cls,"_instance"): cls._instance=super(SingletonType,cls).__call__(*args,**kwargs) returncls._instance classFoo(metaclass=SingletonType): def__init__(self): pass
希望本文所述对大家基于flask框架的Python程序设计有所帮助。