基于模块的单例模式

 原理:

  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. jqgrid 获取选中行主键集合

    如何获取选中行的主键集合呢? 使用  getGridParam(selarrrow) 方法可获取所有选中行的主键集合. 注意:此处的主键集合是指-设置为主键的列(key: true).再次提醒:一个j ...

  2. 【LeetCode7】Reverse Integer★

    题目描述: 解题思路: 反转的方法很简单,重点在于判断溢出的问题,下面给出了两种方法. Java代码: 方法一: 判断溢出方法:在执行完int newResult=result*10+tail语句后, ...

  3. 20155220 《网络对抗》Exp 8 Web基础

    20155220 <网络对抗>Exp 8 Web基础 基础问题回答 实践内容 1.Web前端HTML 配置环境 正常安装.启动Apache 安装:sudo apt-get install ...

  4. sprintboot 和swagger2整合生成文档

    1.创建springboot 工程 2.引入maven依赖 <dependency> <groupId>io.springfox</groupId> <art ...

  5. Luogu P3370 【模板】字符串哈希

    方法很多,hash,双hash(个人想到一种三hash),挂链,还有STL: map 乱搞 CODE #include<iostream> #include<map> #inc ...

  6. STM32-M0中断优先级介绍

    先解释中断优先级,后面讲代码的实现. 差异:M0的中断优先级相比于M4,没有用到分组,且只用到了2个bit位(即0~3)来设置,数值越小,优先级越高:同等优先级,根据终端号的大小来决定谁先执行. 根据 ...

  7. JavaScript组成—— DOM、BOM、ECMAScript

    ECMAScript是JS的核心:提供核心语言功能 DOM(文档对象模型):提供访问和操作网页内容的方法和接口 BOM(浏览器对象模型):提供与浏览器交互的方法和接口 1. DOM(文档对象模型) 1 ...

  8. MOSFET的小信号模型和频率响应

    这部分内容大部分参考W.Y.Choi的课堂讲义第三讲和第四讲:http://tera.yonsei.ac.kr/class/2007_1/main.htm 一.小信号模型 首先要明确一点,大部分情形M ...

  9. 小白之selenium+python关于cookies绕开登录1

    cookie是存储在本地浏览器目录的一些信息,详细一点的话可以查看度娘,按照我的理解就是将信息存储在本地,访问网站的时候,网站的服务器会优先读取本地目录位置的信息,然后做出相对的反应.这就是为什么有的 ...

  10. GitHub笔记(一)——本地库基础操作

    零.基础概念理解——可以访问廖雪峰老师的网站https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c01 ...