当前位置 博文首页 > Python单例模式实例分析

    Python单例模式实例分析

    作者:admin 时间:2021-07-20 17:46

    本文实例讲述了Python单例模式的使用方法。分享给大家供大家参考。具体如下:

    方法一

    复制代码 代码如下:
    import threading 
     
    class Singleton(object): 
        __instance = None 
     
        __lock = threading.Lock()   # used to synchronize code 
     
        def __init__(self): 
            "disable the __init__ method" 
     
        @staticmethod 
        def getInstance(): 
            if not Singleton.__instance: 
                Singleton.__lock.acquire() 
                if not Singleton.__instance: 
                    Singleton.__instance = object.__new__(Singleton) 
                    object.__init__(Singleton.__instance) 
                Singleton.__lock.release() 
            return Singleton.__instance

    1.禁用__init__方法,不能直接创建对象。

    2.__instance,单例对象私有化。

    3.@staticmethod,静态方法,通过类名直接调用。

    4.__lock,代码锁。

    5.继承object类,通过调用object的__new__方法创建单例对象,然后调用object的__init__方法完整初始化。

    6.双重检查加锁,既可实现线程安全,又使性能不受很大影响。

    方法二:使用decorator

    复制代码 代码如下:
    #encoding=utf-8 
    def singleton(cls): 
        instances = {} 
        def getInstance(): 
            if cls not in instances: 
                instances[cls] = cls() 
            return instances[cls] 
        return getInstance 
     
    @singleton 
    class SingletonClass: 
        pass 
     
    if __name__ == '__main__': 
        s = SingletonClass() 
        s2 = SingletonClass() 
        print s 
        print s2

    也应该加上线程安全

    复制代码 代码如下:
    import threading 
     
    class Sing(object): 
        def __init__(): 
            "disable the __init__ method" 
     
        __inst = None # make it so-called private 
     
        __lock = threading.Lock() # used to synchronize code 
     
        @staticmethod 
        def getInst(): 
            Sing.__lock.acquire() 
            if not Sing.__inst: 
                Sing.__inst = object.__new__(Sing) 
                object.__init__(Sing.__inst) 
            Sing.__lock.release() 
            return Sing.__inst

    希望本文所述对大家的Python程序设计有所帮助。

    jsjbwy
    下一篇:没有了