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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
Python写的服务监控程序实例
Jan 31 Python
详细介绍Python函数中的默认参数
Mar 30 Python
Python实现购物系统(示例讲解)
Sep 13 Python
教你用Python写安卓游戏外挂
Jan 11 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
Python操作redis和mongoDB的方法
Dec 19 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
使用Python pip怎么升级pip
Aug 11 Python
django使用graphql的实例
Sep 02 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 ajax 静态分页过程形式
2011/09/02 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
python将视频转换为全字符视频
2019/04/26 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
找到不普通的东西:Bonanza
2016/10/20 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
幼师专业求职推荐信
2013/11/08 职场文书
幼教求职信
2014/03/12 职场文书
读书月活动方案
2014/05/22 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
Python实现byte转integer
2021/06/03 Python