基于模块的单例模式

 原理:

  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. day29

    今日内容: 异常处理 元类介绍 元类(通过元类中的__init__方法,改变实例化获得的类) 元类(通过元类中的__call__方法,改变实例化获得的类实例化出来的对象) 1.异常处理: 什么是异常处 ...

  2. C++面向对象模型

    1. 基础知识 C++编译器怎样完毕面向对象理论到计算机程序的转化? 换句话:C++编译器是怎样管理类.对象.类和对象之间的关系 详细的说:详细对象调用类写的方法,那,c++编译器是怎样区分,是那个详 ...

  3. static成员函数不能调用non-static成员函数

    1 一般类静态成员函数不能调用非静态成员函数 2 static成员函数可以调用构造函数吗? 答案是肯定的,由于static成员函数没有this指针,所以一般static成员函数是不能访问non-sta ...

  4. WPF的Style的TargetType不同写法的异同

    原文:WPF的Style的TargetType不同写法的异同 <Style TargetType="TextBlock"> <Setter Property=&q ...

  5. 如何写论文的introduction

    重要的是写Introduction.写Introduction就和写童话一样.(转自知乎珵cici) 1. 有一条巨龙抓走了公主 (介绍你的问题为什么值得研究) 2. 巨龙是多么多么多么难打(强调你的 ...

  6. 如何设计一个异步Web服务——任务调度

    接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...

  7. Vue.js 相关知识(动画)

    1. 简介 Vue 在插入.更新或移除 DOM 时,提供多种不同方式的过渡效果,并提供 transition 组件来实现动画效果(用 transition 组件将需执行过渡效果的元素包裹) 语法:&l ...

  8. 微软职位内部推荐-Sr. SE - Office incubation

    微软近期Open的职位: Senior Software Engineer-Office Incubation Office China team is looking for experienced ...

  9. 腾讯 深圳 25928-PHP开发工程师(深圳)

    工作地点:深圳 职位类别:技术类 招聘人数:1人 工作职责: 负责游戏研运体系流程工具及相关产品的开发.维护: 参与支撑系统的需求分析.设计.编码: 承担外包开发成员技术导师,解决技术难点,把控开发质 ...

  10. sqlserver批量删除字段 msrepl_tran_version

    屁话不多说. 原因: msrepl_tran_version由于有非空约束.所以不能直接删除. --###############################################--1 ...