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 相关文章推荐
Django小白教程之Django用户注册与登录
Apr 22 Python
django自带的server 让外网主机访问方法
May 14 Python
Python递归函数实例讲解
Feb 27 Python
python验证身份证信息实例代码
May 06 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
Python创建数字列表的示例
Nov 28 Python
python单例设计模式实现解析
Jan 07 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
Python Selenium库的基本使用教程
Jan 04 Python
Python 制作自动化翻译工具
Apr 25 Python
python运算符之与用户交互
Apr 13 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+jquery实时显示网站在线人数的方法
2015/01/04 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
网站上面有这种切换效果
2006/06/26 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
AngularJS表单验证功能分析
2017/05/26 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
Python subprocess模块学习总结
2014/03/13 Python
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
深入理解Python中的*重复运算符
2017/10/28 Python
python 自动批量打开网页的示例
2019/02/21 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
毕业生求职推荐信
2013/11/04 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
财务整改报告范文
2014/11/05 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
党组织结对共建协议书
2016/03/23 职场文书