• 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
  • 相关阅读:
    这种人就是傻逼
    WinDBG + VMWare 双机调试
    最近我遇到了一个代码上的问题
    GITHUB,Fork别人的代码,然后更新的问题
    又半个月没写了,最近忙,真的忙,在考虑换工作的问题
    最近在弄clamav,这里把clamav的编译方法弄一下吧
    基于seay代码,加了个小功能
    CTF:第七题
    CTF:第六题
    Python str拼接bytes
  • 原文地址:https://www.cnblogs.com/shijieli/p/10143988.html
Copyright © 2020-2023  润新知