Django_基于模块的单例模式
基于模块的单例模式
原理:
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_基于模块的单例模式的更多相关文章
- Python 基于python实现单例模式
基于python实现单例模式 by:授客 QQ:1033553122 概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...
- 09 基于模块wsgiref版web框架
09 基于模块wsgiref版web框架 模块引入 真实开发中的python web程序,一般会分为两部分: 服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...
- 基于AtomicReference的单例模式写法
AtomicReference类主要属性(来源于jdk1.7中的源码) public class AtomicReference<V> implements java.io.Seriali ...
- Django-CRM项目学习(一)-admin组件
开始今日份整理 1.admin组件使用 1.1 创建django项目以及开启APP01 略 1.2 创建类 使用django自带的sqlite3的小型文件型的数据库 注:使用sqlite3类型的数据库 ...
- Django admin组件源码流程
admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...
- CRM项目之stark组件(1)
admin组件 admin组件的简单使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py ...
- day 65 crm(2) admin源码解析,以及简单的仿造admin组件
前情提要: crm中的admin组件重写. 一:admin的autodiscover 作用:实现扫面该项目中的所有的admin 1:执行顺序-> 按照注册的顺序执行 二:单例模式 1:普通案例的 ...
- Django-rest-framework源码分析(三)
APIView(二) 在APIView执行dispatch()方法的时候,它不仅做了分发函数的功能,还进行了一系列的校验. Django的全局校验一般写在中间件中,但是rest_framework于D ...
- 设计模式---单例模式,pickle模块
设计模式---单例模式 简介 单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实 例存在.当你希望在整个系统中,某个类只能出现一个实例时 ...
随机推荐
- APP快速搭建框架
AppDelegate: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDicti ...
- 在AspNetCore 中 使用Redis实现分布式缓存 (转载)
文章概念描述 分布式缓存描述:分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式锁.事物.系统 等有很多.使我们对分布式本身就有一个很明确的认识,分布式就是有 ...
- Feeling_2018_5_21
“像我们这种普通的家庭,爸爸妈妈年纪大了有时候需要我们.” 或许真正的长大,不是去了多少地方,走了多少路,爱了多少人,赚了多少钱,而是你能以多大的努力为你的亲人.家庭负责任.如果你现在觉得自己过得很轻 ...
- 20155211 网络对抗 Exp9 Web安全基础实践
20155211 网络对抗 Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语 ...
- 连接到win2003的远程桌面,客户端要如何操作
第一步:命令行执行mstsc 第二步:处输入开启了远程桌面功能的计算机IP地址.
- LeetCode Letter Combinations of a Phone Number (DFS)
题意 Given a digit string, return all possible letter combinations that the number could represent. A ...
- UE4添加植被Foliage Type
在UE4中的地形渲染上不可避免的需要添加植被,而如果采取手动添加StaticMesh植被的方式则会浪费大量的时间精力. UE4提供了一种批量添加地面植被类型的方式Foliage Type.在编辑器内容 ...
- js闭包的作用
js闭包的用途详解 js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文 我们来看 ...
- 12.18daily_scrum
本软件中的最后一个界面——“关于”界面的设计已经开始进行,数据传输的内容也差不多进行过半,最主要的任务依旧在测试过程中,我们组接下来还是要大力加强测试的强度和数量,注意边际数据和错误数据的测试处理: ...
- 作业六:小学生四则运算之NABCD模型与产品Backlog。
NABCD模型与产品Backlog NABCD模型 ) N (Need 需求) 方便了老师和学生,使他们可以想要的时候随时可以得到,省时省力,快速出题,马上得到答案. ) A (Approach 做法 ...
