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中join和split用法实例
Apr 14 Python
python实现类的静态变量用法实例
May 08 Python
python实现八大排序算法(2)
Sep 14 Python
Python生成短uuid的方法实例详解
May 29 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
python虚拟环境迁移方法
Jan 03 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
keras读取h5文件load_weights、load代码操作
Jun 12 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 多关键字 高亮显示实现代码
2012/04/23 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
PHP重载基础知识回顾
2020/09/10 PHP
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
python 判断自定义对象类型
2009/03/21 Python
Python中的各种装饰器详解
2015/04/11 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python 实现单通道转3通道
2019/12/03 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
转党组织关系介绍信
2014/01/08 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年中秋寄语
2015/07/31 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript