首页 > 编程 > Python > 正文

Python单例模式的两种实现方法

2019-11-25 15:56:06
字体:
来源:转载
供稿:网友

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单例模式的实例详解,如有疑问请留言或者到本站的社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表