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中requests模块的使用方法
Apr 08 Python
Python自定义线程池实现方法分析
Feb 07 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
在Pycharm中执行scrapy命令的方法
Jan 16 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
Python Django基础二之URL路由系统
Jul 18 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
Python如何实现爬取B站视频
May 20 Python
Python开发入门——迭代的基本使用
Sep 03 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 Python
python 使用openpyxl读取excel数据
Feb 18 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
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
在Django框架中编写Contact表单的教程
2015/07/17 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
python文件写入write()的操作
2019/05/14 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
酒吧员工的岗位职责
2013/11/26 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
html form表单基础入门案例讲解
2021/07/21 HTML / CSS