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 getopt 参数处理小示例
Jun 09 Python
Python库urllib与urllib2主要区别分析
Jul 13 Python
基于Python的身份证号码自动生成程序
Aug 15 Python
python数据结构之图的实现方法
Jul 08 Python
深入浅析Python中的yield关键字
Jan 24 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
Django框架视图介绍与使用详解
Jul 18 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Python assert关键字原理及实例解析
Dec 13 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
python 绘制正态曲线的示例
Sep 24 Python
使用Pytorch训练two-head网络的操作
May 28 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安装全攻略:APACHE
2006/10/09 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
jQuery实现滑动开关效果
2020/08/02 jQuery
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
python同时替换多个字符串方法示例
2019/09/17 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
应届生简历中的自我评价
2014/01/13 职场文书
会议邀请书范文
2014/02/02 职场文书
软件项目实施计划书
2014/05/02 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
2015年服务员工作总结
2015/04/08 职场文书
联欢会开场白
2015/06/01 职场文书
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
python游戏开发Pygame框架
2022/04/22 Python