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之不要红头文件(1)
Sep 28 Python
Python中zfill()方法的使用教程
May 20 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
Jul 20 Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
Django中间件实现拦截器的方法
Jun 01 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
python实现信号时域统计特征提取代码
Feb 26 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
深入理解Pytorch微调torchvision模型
Nov 11 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面向对象public private protected 访问修饰符
2013/06/30 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
vue elementui form表单验证的实现
2018/11/11 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
vue实现选中效果
2020/10/07 Javascript
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
python解释器spython使用及原理解析
2019/08/24 Python
Python tornado上传文件的功能
2020/03/26 Python
Python 合并拼接字符串的方法
2020/07/28 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
《孔子拜师》教学反思
2014/02/24 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
党员承诺践诺书
2014/05/20 职场文书
倡议书格式及范文
2015/04/29 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
爱的教育读书笔记
2015/06/26 职场文书
党员反邪教心得体会
2016/01/15 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python