单例模式

Posted longyunfeigu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

所谓的单例模式,就是对一个类做一定的特殊处理,使得在实例化这个类的对象的时候内存中只放着一份对象。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文件去拿了

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块