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实现的飞速中文网小说下载脚本
Apr 23 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
通过python爬虫赚钱的方法
Jan 29 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
python实现代码统计程序
Sep 19 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
Python文件读写w+和r+区别解析
Mar 26 Python
Python如何进行时间处理
Aug 06 Python
如何使用Python调整图像大小
Sep 26 Python
python定时截屏实现
Nov 02 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
用来解析.htgroup文件的PHP类
2012/09/05 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
python判断是空的实例分享
2020/07/06 Python
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
给男朋友的道歉信
2014/01/12 职场文书
大学生创业感言
2014/01/25 职场文书
公司领导班子对照材料
2014/08/18 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
人事局接收函
2015/01/30 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫