标签:实例化 方式 **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
标签:实例化 方式 **kw) 不同 不同的 __init__ djang self span
原文地址:https://www.cnblogs.com/shijieli/p/10143988.html