一、單例模式 a、單例模式分為四種:文件,類,基於__new__方法實現單例模式,基於metaclass方式實現 b、類實現如下: c、基於__new__方法實現單例模式 d、基於metaclass方式實現單例模式 ...
一、單例模式
a、單例模式分為四種:文件,類,基於__new__方法實現單例模式,基於metaclass方式實現
b、類實現如下:
class Sigletion(objects): import time def __init__(self): time.sleep(1) @classmethod def instance(cls,*args,**kwargs) if not hasattr(Sigletion,'_instance'): Sigletion._instance=Sigletion(*args,**kwargs) return Sigletion._instance import threading daf task(arg): obj=Sigletion.instance() print(obj) for i in range(10): t=threading.Thread(target=task,args=[i,]) t.start()
c、基於__new__方法實現單例模式
import time 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,*args,**kwargs) return Singleton._instance obj1=Singleton() obj2=Singleton() print(obj1,obj2) def task(arg): obj = Singleton() print(obj) for i in range(10): t = threading.Thread(target=task,args=[i,]) t.start()
d、基於metaclass方式實現單例模式
""" 1.對象是類創建,創建對象時候類的__init__方法自動執行,對象()執行類的 __call__ 方法 2.類是type創建,創建類時候type的__init__方法自動執行,類() 執行type的 __call__方法(類的__new__方法,類的__init__方法) # 第0步: 執行type的 __init__ 方法【類是type的對象】 class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): pass # 第1步: 執行type的 __call__ 方法 # 1.1 調用 Foo類(是type的對象)的 __new__方法,用於創建對象。 # 1.2 調用 Foo類(是type的對象)的 __init__方法,用於對對象初始化。 obj = Foo() # 第2步:執行Foodef __call__ 方法 obj() """
import threading class SingletonType(type): _instace_lock=threading.Lock() def __call__(cls, *args, **kwargs): if not hasattr(cls, "_instance"): with SingletonType._instace_lock: if not hasattr(cls, "_instance"): cls._instance = super(SingletonType,cls).__call__(*args, **kwargs) return cls._instance class Foo(metaclass=SingletonType): def __init__(self,name): self.name=name obj1 = Foo('name') obj2 = Foo('name') print(obj1,obj2)