基于模块的单例模式

 原理:

  Python 的独有特性 :

      模块的导入只能生效一次. 再重复导入只要基于一套环境都是使用的 最初 的那份资源.

 示例:

  文档结构:

 # mysingleton.py
class My_Singleton(object):
def foo(self):
print("foo.....") my_singleton = My_Singleton()
 # func.py
from mysingleton import my_singleton def bar():
print(id(my_singleton))
 # main.py
# 单例模式方式2 :模块方式 # from mysingleton import my_singleton,My_Singleton # my_singleton.foo()
#
# print(id(my_singleton)) # 思考1
# from mysingleton import my_singleton as my_singleton_new
#
# print(id(my_singleton_new))
# print(id(my_singleton)) # 思考2
# import func
#
# func.bar() # 思考3 from mysingleton import my_singleton,My_Singleton ms1=My_Singleton() from mysingleton import my_singleton,My_Singleton ms2=My_Singleton() print(id(ms1))
print(id(ms2))

 思考解析:

 # 单例模式

 # 单例模式方式2 :模块方式

 from mysingleton import my_singleton,My_Singleton
my_singleton.foo()
print(id(my_singleton)) # 思考1
from mysingleton import my_singleton as my_singleton_new
print(id(my_singleton_new))
print(id(my_singleton)) # 一致
# 模块的导入只能生效一次,在调用是基于之前的模块,改命也是同一个
# my_singleton 模块导入的时候有了实例
# 之后再调用依旧使用已有的示例
# 思考2
import func
func.bar() # 一致
# 虽然模块的导入是基于文件的,但是这三个文件都是 Python_Django程序的一部分,公用这个程序的同一套环境,
# 不论是func 中的示例 还是 main 中的实例. 都是 mysingleton 中在第一次导入时创建的示例 即 " my_singleton "
# 思考3
from mysingleton import my_singleton,My_Singleton
ms1=My_Singleton()
from mysingleton import my_singleton,My_Singleton
ms2=My_Singleton()
print(id(ms1)) #
print(id(ms2)) # # 不一致
# 你这是创建示例啊.不是导入示例啊.
# 很明显是创建了两次示例当然不一样啊.
# 当然你如果这时候把 mysingleton 里面的 my_singleton 拿过来一起对比
# 自然会是三个都不一样. 因为确实的实例化了三次.和导入后调用是完全不同的性质.
print(id(my_singleton)) #

 补充:

基于__new__ 的单例模式

原理 :

   __init__ ()  方法执行前必须要执行 __new__() 方法 ,

  类内部定义示例调用全局的 __new__()

  利用object 中的 __new__() 方法 创建一个实例后赋值给内部变量

  然后每次调用类进行示例通过判断内部变量

  从而实现每次类的示例都调用同一个示例

示例:

  基于原理将 类本身进行了一次封装实例化

 # 单例模式方式1 :__new__

 # class Singleton(object):
#
# _instance = None
# def __new__(cls, *args, **kw):
# if not cls._instance:
# cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
# return cls._instance
#
# class MyClass(Singleton):
# a = 1
#
#
#
# mc1=MyClass()
#
# mc2=MyClass()
#
# mc3=MyClass() # print(id(mc1))
# print(id(mc2))
# print(id(mc3))

更详细的示例参考 

https://www.cnblogs.com/shijieli/p/9939298.html

Django_基于模块的单例模式的更多相关文章

  1. Python 基于python实现单例模式

    基于python实现单例模式 by:授客 QQ:1033553122   概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...

  2. 09 基于模块wsgiref版web框架

    09 基于模块wsgiref版web框架 模块引入 真实开发中的python web程序,一般会分为两部分:       服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...

  3. 基于AtomicReference的单例模式写法

    AtomicReference类主要属性(来源于jdk1.7中的源码) public class AtomicReference<V> implements java.io.Seriali ...

  4. Django-CRM项目学习(一)-admin组件

    开始今日份整理 1.admin组件使用 1.1 创建django项目以及开启APP01 略 1.2 创建类 使用django自带的sqlite3的小型文件型的数据库 注:使用sqlite3类型的数据库 ...

  5. Django admin组件源码流程

    admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...

  6. CRM项目之stark组件(1)

    admin组件 admin组件的简单使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py ...

  7. day 65 crm(2) admin源码解析,以及简单的仿造admin组件

    前情提要: crm中的admin组件重写. 一:admin的autodiscover 作用:实现扫面该项目中的所有的admin 1:执行顺序-> 按照注册的顺序执行 二:单例模式 1:普通案例的 ...

  8. Django-rest-framework源码分析(三)

    APIView(二) 在APIView执行dispatch()方法的时候,它不仅做了分发函数的功能,还进行了一系列的校验. Django的全局校验一般写在中间件中,但是rest_framework于D ...

  9. 设计模式---单例模式,pickle模块

    设计模式---单例模式 简介 单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实 例存在.当你希望在整个系统中,某个类只能出现一个实例时 ...

随机推荐

  1. lwip Packet buffers (PBUF) API 操作 集合

    struct pbuf *  pbuf_alloc (pbuf_layer layer, u16_t length, pbuf_type type)   struct pbuf *  pbuf_all ...

  2. APP快速搭建框架

    AppDelegate: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDicti ...

  3. 如何在ASP.NET Core中构造UrlHelper,及ASP.NET Core MVC路由讲解

    参考文章: Unable to utilize UrlHelper 除了上面参考文章中介绍的方法,其实在ASP.NET Core MVC的Filter拦截器中要使用UrlHelper非常简单.如下代码 ...

  4. [HAOI2010]订货 BZOJ2424

    分析: 能看出来,这是一个费用流的题,建图很朴实,i连i+1,费用为存储费用,流量为仓库容量,之后S连i,费用为单价,流量为inf,之后i连T,流量为a[i],费用为0,之后裸上费用流... 附上代码 ...

  5. WPF XML序列化保存数据 支持Datagrid 显示/编辑/添加/删除数据

    XML序列化保存数据 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  6. 20155217《网络对抗》Exp03 免杀原理与实践

    20155217<网络对抗>Exp03 免杀原理与实践 实践内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程 ...

  7. 总是套路留人心, JAVA提供的套路: LinkedHashMap实现LRU缓存; InvocationHandler实现动态代理; fork/join实现窃取算法

    1. LinkedHashMap实现LRU缓存 LRU缓存核心是根据访问顺序排序, 自动移除队尾缓存, LinkedHashMap已经实现了这些要求: public LRUCache<K, V& ...

  8. mfc 嵌套类

    嵌套类 一. 嵌套类 嵌套类的定义 将某个类的定义放在另一个类的内部,这样的类定义,叫嵌套类. class AAA { int aaa; class BBB { int bbb; //其它成员或者函数 ...

  9. 几种flash存储芯片的用途和分类

    1.IIC EEPROM------容量小,采用的是IIC通信协议:用于在掉电时,存系统配置参数,比如屏幕亮度等.常用芯片型号有 AT24C02.FM24C02.CAT24C02等,其常见的封装多为D ...

  10. Js_网站右下角悬浮视窗可关闭广告

    站右下角悬浮视窗可关闭广告代码,可收缩.展开,关闭,内容区可自定义html,兼容IE8+.FireFox.Chrome.Safari等主流浏览器.广告图片尺寸300x250. 使用方法:在head区域 ...