Django_基於模塊的單例模式


 

基於模塊的單例模式

 原理:

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM