python 单例模式详解

应用场景:
1)资源共享的情况下,避免由于资源操作时导致的性能问题或损耗等。如上述中的日志文件,应用配置。
2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

一 .模块(model)就是天然的单例

模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件

mysingleton.py

class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()

import mysingleton

二 .基于装饰器实现

优点: 实现简单 缺点: 多线程调用不安全

def singlem(fn):
    __instans = {}  
    def function(*args, **kwargs):
        if fn not in __instans:
            __instans[fn] = fn(*args, **kwargs)
        return __instans[fn]
    return function
import time

@singlem
def person(a=0, b=1):
    return (a, b)

print((person(1,2)))
print((person(2, 3)))
time.sleep(2)
print((person(3, 4)))
# 输出结果
(1, 2)
(1, 2)
(1, 2)
[Finished in 2.3s]

三. 基于类实现

class Singleton(object):
 
    def __init__(self):
        pass
 
    @classmethod
    def instance(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            Singleton._instance = Singleton(*args, **kwargs)
        return Singleton._instance

四. 基于类实现-多线程时加锁

import time
import threading
class Singleton(object):
    _instance_lock = threading.Lock()

    def __init__(self):
        time.sleep(1)

    @classmethod
    def instance(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            with Singleton._instance_lock:
                if not hasattr(Singleton, "_instance"):
                    Singleton._instance = Singleton(*args, **kwargs)
        return Singleton._instance

五.基于new方法实现(推荐使用,方便)

我们知道,当我们实例化一个对象时,是先执行了类的new方法(我们没写时,默认调用object.new),实例化对象;然后再执行类的init方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式

import threading
class Singleton(object):
    _instance_lock = threading.Lock()

    def __init__(self):
        pass


    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            with Singleton._instance_lock:
                if not hasattr(Singleton, "_instance"):
                    Singleton._instance = object.__new__(cls)  
        return Singleton._instance

附: https://blog.csdn.net/weixin_44239343/article/details/89376796

你可能感兴趣的:(python 单例模式详解)