方法一
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