lx86 发表于 2015-4-25 09:30:38

Python单例模式研究

  方法一
  



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
  



Python代码
[*]#encoding=utf-8
[*]def singleton(cls):
[*]    instances = {}
[*]    def getInstance():
[*]      if cls not in instances:
[*]            instances = cls()
[*]      return instances
[*]    return getInstance
[*]
[*]@singleton
[*]class SingletonClass:
[*]    pass
[*]
[*]if __name__ == '__main__':
[*]    s = SingletonClass()
[*]    s2 = SingletonClass()
[*]    print s
[*]    print s2
  
  也应该加上线程安全
  
  
  附:性能没有方法一高
  



Python代码
[*]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
页: [1]
查看完整版本: Python单例模式研究