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探索之自定义实现线程池
Oct 27 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
Python中交换两个元素的实现方法
Jun 29 Python
浅析python的Lambda表达式
Feb 27 Python
超简单使用Python换脸实例
Mar 27 Python
用django-allauth实现第三方登录的示例代码
Jun 24 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 Python
python实现双人五子棋(终端版)
Dec 30 Python
python中yield的用法详解
Jan 13 Python
python套接字socket通信
Apr 01 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
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
Python map和reduce函数用法示例
2015/02/26 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
详解Python中的四种队列
2018/05/21 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
财务会计应届生求职信
2013/11/24 职场文书
留守儿童工作方案
2014/06/02 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL