python 四种单例模式

 1  
 2 1 使用__new__方法
 3 Python
 4 class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): orig = super(Singleton, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instanceclass MyClass(Singleton): a = 1
 5 
 6 
 7 
 8 
 9 
10 class Singleton(object):
11     def __new__(cls, *args, **kw):
12         if not hasattr(cls, '_instance'):
13             orig = super(Singleton, cls)
14             cls._instance = orig.__new__(cls, *args, **kw)
15         return cls._instance
16  
17 class MyClass(Singleton):
18     a = 1
19 2 共享属性
20 创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.
21 
22 Python
23 class Borg(object): _state = {} def __new__(cls, *args, **kw): ob = super(Borg, cls).__new__(cls, *args, **kw) ob.__dict__ = cls._state return obclass MyClass2(Borg): a = 1
24 
25 
26 
27 
28 
29 
30 class Borg(object):
31     _state = {}
32     def __new__(cls, *args, **kw):
33         ob = super(Borg, cls).__new__(cls, *args, **kw)
34         ob.__dict__ = cls._state
35         return ob
36  
37 class MyClass2(Borg):
38     a = 1
39 3 装饰器版本
40 Python
41 def singleton(cls, *args, **kw): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return getinstance@singletonclass MyClass: ...
42 
43 
44 
45 
46 
47 
48 def singleton(cls, *args, **kw):
49     instances = {}
50     def getinstance():
51         if cls not in instances:
52             instances[cls] = cls(*args, **kw)
53         return instances[cls]
54     return getinstance
55  
56 @singleton
57 class MyClass:
58   ...
59 4 import方法
60 作为python的模块是天然的单例模式
61 
62 Python
63 # mysingleton.pyclass My_Singleton(object): def foo(self): passmy_singleton = My_Singleton()# to usefrom mysingleton import my_singletonmy_singleton.foo()
64 
65 
66 
67 # mysingleton.py
68 class My_Singleton(object):
69     def foo(self):
70         pass
71  
72 my_singleton = My_Singleton()
73  
74 # to use
75 from mysingleton import my_singleton
76  
77 my_singleton.foo()
原文地址:https://www.cnblogs.com/chengyunshen/p/7196280.html