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 调用VC++的动态链接库(DLL)
Sep 06 Python
python改变日志(logging)存放位置的示例
Mar 27 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
pandas表连接 索引上的合并方法
Jun 08 Python
python中正则表达式 re.findall 用法
Oct 23 Python
python psutil模块使用方法解析
Aug 01 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
python如何调用字典的key
May 25 Python
python 利用opencv实现图像网络传输
Nov 12 Python
用Python爬取某乎手机APP数据
Jun 15 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 Python
python 单机五子棋对战游戏
Apr 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php实例分享之html转为rtf格式
2014/06/02 PHP
php向js函数传参的几种方法
2014/08/10 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
解读Django框架中的低层次缓存API
2015/07/24 Python
Python开发的实用计算器完整实例
2017/05/10 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Python 在函数上添加包装器
2020/07/28 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
怎样比较两个类型为String的字符串
2016/08/17 面试题
南京软件公司的.net程序员笔试题
2014/08/31 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
竞选大队委员演讲稿
2014/04/28 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
新党章心得体会
2014/09/04 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
天鹅湖观后感
2015/06/09 职场文书
运动会新闻稿
2015/07/17 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android