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 相关文章推荐
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
PyQt5利用QPainter绘制各种图形的实例
Oct 19 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
python清除字符串前后空格函数的方法
Oct 21 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
python文件操作的简单方法总结
Nov 07 Python
关于numpy.where()函数 返回值的解释
Dec 06 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
Django模板获取field的verbose_name实例
May 19 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 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
社区(php&&mysql)五
2006/10/09 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
Python创建xml的方法
2015/03/10 Python
浅谈python中set使用
2016/06/30 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
pyshp创建shp点文件的方法
2018/12/31 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
python文件编写好后如何实践
2020/07/07 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
2015年电气技术员工作总结
2015/07/24 职场文书
辞职申请书范本
2019/05/20 职场文书
基于docker安装zabbix的详细教程
2022/06/05 Servers