服务器之家

服务器之家 > 正文

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

时间:2020-12-02 00:29     来源/作者:huaxia524151

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

方法一 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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

也应该加上线程安全  

附:性能没有方法一高

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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单例模式的实例详解,如有疑问请留言或者到本站的社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://huaxia524151.iteye.com/blog/1345156

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
返回顶部