zoukankan      html  css  js  c++  java
  • 单例模式

    所谓的单例模式,就是对一个类做一定的特殊处理,使得在实例化这个类的对象的时候内存中只放着一份对象。python单例模式的实现有很多种方式,这里只列出本人常用的两种方式,其中第二种是Django源码使用的方式

    new

    from threading import Lock
    from threading import Thread, current_thread
    import time
    lock = Lock()
    
    class SingleModel(object):
        __instance = None
    
        def __new__(cls, *args, **kwargs):
            with lock:
                if not cls.__instance:
                    cls.__instance = object.__new__(cls, *args, **kwargs)
                return cls.__instance
            # with lock:
            #     if not cls.__instance:
            #         time.sleep(1)
            #         cls.__instance = object.__new__(cls, *args, **kwargs)
            #     return cls.__instance
                
            # if not cls.__instance:
            #     time.sleep(1)
            #     cls.__instance = object.__new__(cls, *args, **kwargs)
            # return cls.__instance
    
    def task1():
        s = SingleModel()
        print(current_thread().name, id(s))
    
    def task2():
        s = SingleModel()
        print(current_thread().name, id(s))
    
    if __name__ == '__main__':
        t1 = Thread(target=task1, name='t1')
        t2 = Thread(target=task1, name='t2')
        t1.start()
        t2.start()
    

    new 这种方式在每次实例化的时候,真实的创建对象的object.new 只会被调用一次

    模块导入

    虽然有很多py文件,但是真正执行的时候只是一个程序,或者说只有一个入口的py文件,其他都是相互导入,在import func的时候会执行from test import single_obj,但是test模块已经导入过一次了,不会重复导入,拿single_obj就从pyc文件去拿了

  • 相关阅读:
    c# 三种取整方法 向上取整 向下取整 四舍五入
    Lambda表达式对DataRow处理
    Dapper数据库字段和model属性映射
    union limit
    北邮五十题
    搜索____深搜 学易错点
    动态规划____有重叠子问题的搜索,都可以转为记忆化搜索
    64位 __int 与 long long写法
    做做 卡特兰数 与 卡米歇尔数
    vector 有点麻烦啊 能简单点么?
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9504782.html
Copyright © 2011-2022 走看看