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中使用logging模块代替print(logging简明指南)
Jul 09 Python
Python连接DB2数据库
Aug 27 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
详解Python正则表达式re模块
Mar 19 Python
Python中dict和set的用法讲解
Mar 28 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
python绘制雪景图
Dec 16 Python
在python shell中运行python文件的实现
Dec 21 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
实现Python3数组旋转的3种算法实例
Sep 16 Python
python把一个字符串切开的实例方法
Sep 27 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
第一节--面向对象编程
2006/11/16 PHP
php实现socket推送技术的示例
2017/12/20 PHP
div层的移动及性能优化
2010/11/16 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
python中私有函数调用方法解密
2016/04/29 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
python中的列表和元组区别分析
2020/12/30 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
高中体育教学反思
2014/01/24 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
民间个人借款协议书
2014/09/30 职场文书
党员倡议书
2015/01/19 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
javaScript Array api梳理
2021/03/31 Javascript