当前位置: 首页 > 后端技术 > Python

Python单例模式

时间:2023-03-25 20:00:14 Python

首先,我们创建一个测试用例deftest_sig(sig_class):a=sig_class(1)print("a={}(1)\na.value={}".format(sig_class.__name__,a.value))b=sig_class(2)print("b={}(2)\nb.value={}".format(sig_class.__name__,b.value))print("现在a.value={}".format(a.value))print("aisb:{}".format(aisb))__new__方法类Singletone():_instance=Nonedef__new__(cls,*args,**kwargs):ifnotcls._instance:#注意这里的__new__不接受参数#参考:https://stackoverflow.com/questions/34777773cls._instance=super().__new__(cls)returncls._instancereturncls._instancedef__init__(self,n):self.value=ntest_sig(Singletone)输出如下:a=Singletone(1)a.value=1b=Singletone(2)b.value=2现在a.value=2aisb:Truepy3.3以后,如果同时创建__init__和__new__,在__new__中,就不要再传参数了。否则,TypeError:object()takesnoparametersmetaclassclassSingle(type):#这里创建了一个Single元类,#注意这里使用的是字典,而不是直接使用None值,#这样,任何使用这个meta该类的子类都会是单例模式,不会互相污染__new__,传入的参数也不一样。cls._instances[cls]=super().__call__(*args,**kwargs)返回cls._instances[cls]classSingleton2(metaclass=Single):def__init__(self,n):self.value=ntest_sig(Singletone2)输出如下:a=Singleton2(1)a.value=1b=Singleton2(2)b.value=1现在a.value=1aisb:True也可以使用装饰器,装饰器类似于元类,但是元类类更优雅。装饰器的用法这里就不展示了。