Flask框架单例模式实现方法详解


Posted in Python onJuly 31, 2019

本文实例讲述了Flask框架单例模式实现方法。分享给大家供大家参考,具体如下:

单例模式:

程序运行时只能生成一个实例,避免对同一资源产生冲突的访问请求。

Django   admin.py下的admin.site.register() ,  site就是使用文件导入方式的单例模式

创建到单例模式4种方式:

  • 1.文件导入
  • 2. 类方式
  • 3.基于__new__方式实现
  • 4.基于metaclass方式实现

1.文件导入:

in  single.py

class Singleton():
  def __init__(self):
    pass
site = Singleton()

类似:

import time  第一次已经把导入的time模块,放入内存
import time  第二次内存已有就不导入了

in  app.py

from single.py import site #第一次导入,实例化site对象并放入内存

in  views.py

from single.py import site #第二次导入,直接从内存拿。

2.类方式:

缺点:改变了单例的创建方式

obj = Singleton.instance()
# 单例模式:无法支持多线程情况
import time
class Singleton(object):
  def __init__(self):
    import time
    time.sleep(1)
  @classmethod
  def instance(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
      Singleton._instance = Singleton(*args, **kwargs)
    return Singleton._instance
# # 单例模式:支持多线程情况
import time
import threading
class Singleton(object):
  _instance_lock = threading.Lock()
  def __init__(self):
    time.sleep(1)
  @classmethod
  def instance(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
      with Singleton._instance_lock:
        if not hasattr(Singleton, "_instance"):
          Singleton._instance = Singleton(*args, **kwargs)
    return Singleton._instance

3.基于__new__方式实现:

单例创建方式:

obj1 = Singleton()
obj2 = Singleton()
import time
import threading
class Singleton(object):
  _instance_lock = threading.Lock()
  def __init__(self):
    pass
  def __new__(cls, *args, **kwargs):
    if not hasattr(Singleton, "_instance"):
      with Singleton._instance_lock:
        if not hasattr(Singleton, "_instance"):
          Singleton._instance = object.__new__(cls, *args, **kwargs)
    return Singleton._instance

4.基于metaclass方式实现

基于metaclass方式实现的原理:

  • 1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法
  • 2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法

单例创建方式:

obj1 = Foo()
obj2 = Foo()
import threading
class SingletonType(type):
  _instance_lock = threading.Lock()
  def __call__(cls, *args, **kwargs):
    if not hasattr(cls, "_instance"):
      with SingletonType._instance_lock:
        if not hasattr(cls, "_instance"):
          cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
    return cls._instance
class Foo(metaclass=SingletonType):
  def __init__(self):
    pass

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

Python 相关文章推荐
Python实现购物车功能的方法分析
Nov 10 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
python调用摄像头拍摄数据集
Jun 01 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
对Python _取log的几种方式小结
Jul 25 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
python3中sorted函数里cmp参数改变详解
Mar 12 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
Python使用Pygame绘制时钟
Nov 29 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 #Python
详细介绍Python进度条tqdm的使用
Jul 31 #Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 #Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 #Python
django解决订单并发问题【推荐】
Jul 31 #Python
python opencv将图片转为灰度图的方法示例
Jul 31 #Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 #Python
You might like
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
Web开发之JavaScript
2012/03/29 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
Python struct.unpack
2008/09/06 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
python内打印变量之%和f的实例
2020/02/19 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
Python中logger日志模块详解
2020/08/04 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
两只小狮子教学反思
2014/02/05 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
自我查摆剖析材料
2014/10/11 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
公司慰问信范文
2015/03/23 职场文书
四年级作文之说明文作文
2019/10/14 职场文书