由於一個類每一次實例化的時候,都會走它的__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))