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文件去拿了

  • 相关阅读:
    BZOJ3509: [CodeChef] COUNTARI
    BZOJ3790: 神奇项链
    BZOJ3527: [Zjoi2014]力
    BZOJ2194: 快速傅立叶之二
    解题:BJOI 2006 狼抓兔子
    解题:SDOI 2017 数字表格
    解题:TJOI 2015 弦论
    解题:NOI 2016 优秀的拆分
    解题:AHOI2017/HNOI2017 礼物
    解题:洛谷2093 JZPFAR
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9504782.html
Copyright © 2011-2022 走看看