分享兩種 Python 中的單例模式
阿新 • • 發佈:2020-08-27
中心思想 : 在例項之前判斷 該類的屬性有沒有被例項化過。 如果沒有就例項話, 有的話就返回上一次例項話
第一種: 通過 python 自帶的 __new__ 去實現
import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): pass def __new__(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock:if not hasattr(Singleton, "_instance"): Singleton._instance = object.__new__(cls) return Singleton._instance obj1 = Singleton() obj2 = Singleton() print(obj1,obj2)
第二種: 通過裝飾器
def Sing(cls): _instance = {} def _sig(*args, **kwargs): if cls not in _instance: _instance[cls]= cls(*args, **kwargs) return _instance[cls] return _sig @Sing class A: def __init__(self): self.x = 1 a1 = A() a2 = A() print(a1, a2)