码迷,mamicode.com
首页 > 其他好文 > 详细

Django_基于模块的单例模式

时间:2018-12-19 17:07:48      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:实例化   方式   **kw)   不同   不同的   __init__   djang   self   span   

 

基于模块的单例模式

 原理:

  Python 的独有特性 :

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

 

 示例:

  文档结构:

技术分享图片

1 # mysingleton.py
2 class My_Singleton(object):
3     def foo(self):
4         print("foo.....")
5 
6 
7 my_singleton = My_Singleton()
1 # func.py
2 from mysingleton import my_singleton
3 
4 def bar():
5     print(id(my_singleton))
 1 # main.py
 2 # 单例模式方式2 :模块方式
 3 
 4 
 5 # from mysingleton import my_singleton,My_Singleton
 6 
 7 # my_singleton.foo()
 8 #
 9 # print(id(my_singleton))
10 
11 
12 # 思考1
13 # from mysingleton import my_singleton as my_singleton_new
14 #
15 # print(id(my_singleton_new))
16 # print(id(my_singleton))
17 
18 # 思考2
19 # import func
20 #
21 # func.bar()
22 
23 # 思考3
24 
25 from mysingleton import my_singleton,My_Singleton
26 
27 ms1=My_Singleton()
28 
29 from mysingleton import my_singleton,My_Singleton
30 
31 ms2=My_Singleton()
32 
33 print(id(ms1))
34 print(id(ms2))

 

 思考解析:

 1 # 单例模式
 2 
 3 
 4 # 单例模式方式2 :模块方式
 5 
 6 
 7 from mysingleton import my_singleton,My_Singleton
 8 my_singleton.foo()
 9 print(id(my_singleton))
10 
11 
12 # 思考1
13 from mysingleton import my_singleton as my_singleton_new
14 print(id(my_singleton_new))
15 print(id(my_singleton))
16 
17     # 一致 
18     # 模块的导入只能生效一次,在调用是基于之前的模块,改命也是同一个
19     # my_singleton 模块导入的时候有了实例
20     # 之后再调用依旧使用已有的示例
21 
22 
23 # 思考2
24 import func
25 func.bar()
26     
27     # 一致
28     # 虽然模块的导入是基于文件的,但是这三个文件都是 Python_Django程序的一部分,公用这个程序的同一套环境,
29     # 不论是func 中的示例 还是 main 中的实例. 都是 mysingleton 中在第一次导入时创建的示例 即 " my_singleton "
30     
31 
32 # 思考3
33 from mysingleton import my_singleton,My_Singleton
34 ms1=My_Singleton()
35 from mysingleton import my_singleton,My_Singleton
36 ms2=My_Singleton()
37 print(id(ms1))        # 42791320
38 print(id(ms2))        # 42791152
39 
40     
41     # 不一致  
42     # 你这是创建示例啊.不是导入示例啊.
43     # 很明显是创建了两次示例当然不一样啊.
44     # 当然你如果这时候把  mysingleton 里面的 my_singleton 拿过来一起对比
45     # 自然会是三个都不一样. 因为确实的实例化了三次.和导入后调用是完全不同的性质.
46 
47 print(id(my_singleton))        # 43425184

 

 

 

 

 补充:

 

基于__new__ 的单例模式

 

原理 :

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

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

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

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

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

 

示例:

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

 1 # 单例模式方式1 :__new__
 2 
 3 # class Singleton(object):
 4 #
 5 #     _instance = None
 6 #     def __new__(cls, *args, **kw):
 7 #         if not cls._instance:
 8 #             cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
 9 #         return cls._instance
10 #
11 # class MyClass(Singleton):
12 #     a = 1
13 #
14 #
15 #
16 # mc1=MyClass()
17 #
18 # mc2=MyClass()
19 #
20 # mc3=MyClass()
21 
22 
23 # print(id(mc1))
24 # print(id(mc2))
25 # print(id(mc3))

 

更详细的示例参考 

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

 

Django_基于模块的单例模式

标签:实例化   方式   **kw)   不同   不同的   __init__   djang   self   span   

原文地址:https://www.cnblogs.com/shijieli/p/10143988.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!