python中的單例

使用__new__

由於一個類每一次實例化的時候,都會走它的__new__方法。因此咱們能夠使用__new__來控制實例的建立過程,代碼以下:python

 1 class Single:
 2     instance = None
 3 
 4     def __new__(cls, *args, **kwargs):
 5         if cls.instance:
 6             return cls.instance
 7         cls.instance = object.__new__(cls)
 8         return cls.instance
 9 
10 o1 = Single()
11 o2 = Single()
12 print(o1)  # <__main__.Single object at 0x00000000021EDAC8>
13 print(o2)  # <__main__.Single object at 0x00000000021EDAC8>

使用模塊

其實,python的模塊就是自然的單例模式,由於模塊在第一次導入時,會生成.pyc文件,當第二次導入時,就會直接加載.pyc文件,而不會再次執行模塊代碼。函數

1 # 在一個單獨的文件定義一個類 並生成它的實例 這裏我把它保存到mySingle.py中
2 class Single:
3     pass
4 
5 single = Single()
1 from SingleFile import single
2 # 後續在其它文件直接導入使用該對象 該對象即是單例的
3 obj = single

使用裝飾器

咱們知道,裝飾器能夠動態的修改一個類或函數的功能。這裏,咱們也能夠使用裝飾器來裝飾某個類,使其只能生成一個實例:spa

 1 def singleton(cls):
 2     instances = {}
 3     def getinstance(*args,**kwargs):
 4         if cls not in instances:
 5             instances[cls] = cls(*args,**kwargs)
 6         return instances[cls]
 7     return getinstance
 8 
 9 @singleton
10 class MyClass:
11     a = 1
12 
13 c1 = MyClass()
14 c2 = MyClass()
15 print(c1 == c2) # True

使用元類

元類(metaclass)能夠控制類的建立過程,它主要作三件事:攔截類的建立、修改類的定義、返回修改後的類。使用元類實現單例模式的代碼以下:code

 1 class Singleton(type):
 2     _instances = {}
 3     def __call__(cls, *args, **kwargs):
 4         if cls not in cls._instances:
 5             cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
 6         return cls._instances[cls]
 7 
 8 # Python2
 9 # class MyClass(object):
10 #     __metaclass__ = Singleton
11 
12 # Python3
13 class MyClass(metaclass=Singleton):
14    pass
15 
16 a=MyClass()
17 b=MyClass()
18 print(a==b)
19 print(a is b)
20 print(id(a),id(b))
相關文章
相關標籤/搜索