python 实现单例模式的5种方法
一、classmethod装饰器
#全局变量 ip='192.168.13.98' port='3306' classMySQL: __instance=None def__init__(self,ip,port): self.ip=ip self.port=port @classmethod definstance(cls,*args,**kwargs): ifargsorkwargs: cls.__instance=cls(*args,**kwargs) returncls.__instance obj1=MySQL.instance(ip,port) obj2=MySQL.instance() obj3=MySQL.instance() print(obj1) print(obj2,obj2.__dict__) print(obj3,obj3.__dict__)
输出结果
{'ip':'192.168.13.98','port':'3306'}
{'ip':'192.168.13.98','port':'3306'}
二、类的装饰器
defsinglegon(cls): _instance=cls(ip,port) defwrapper(*args,**kwargs): ifargsorkwargs: returncls(*args,**kwargs) return_instance returnwrapper @singlegon classMySQL1: def__init__(self,ip,port): self.ip=ip self.port=port obj1=MySQL1() obj2=MySQL1() obj3=MySQL1('1.1.1.3',8080) print(obj1) print(obj2,obj2.__dict__) print(obj3,obj3.__dict__)
运行结果
{'ip':'192.168.13.98','port':'3306'}
{'ip':'1.1.1.3','port':8080}
三、元类
classMymetaclass(type): def__init__(self,class_name,class_bases,class_dic): super().__init__(class_name,class_bases,class_dic) self.__instance=self(ip,port) def__call__(self,*args,**kwargs): ifargsorkwargs: obj=self.__new__(self) self.__init__(obj,*args,**kwargs) self.__instance=obj returnself.__instance classMySQL2(metaclass=Mymetaclass): def__init__(self,ip,port): self.ip=ip self.port=port obj1=MySQL2() obj2=MySQL2() obj3=MySQL2('1.1.1.3',80) print(obj1) print(obj2,obj2.__dict__) print(obj3,obj3.__dict__)
运行结果
{'ip':'192.168.13.98','port':'3306'}
{'ip':'1.1.1.3','port':80}
四、模块导入
#instance.py classMySQL: def__init__(self,ip,port): self.ip=ip self.port=port ip='192.168.13.98' port=3306 instance=MySQL(ip,port) #测试代码 importos,sys sys.path.append(os.path.dirname(os.path.dirname(__file__))) fromtestimportinstance obj1=instance.instance obj2=instance.instance obj3=instance.MySQL('1.1.1.3',80) print(obj1) print(obj2,obj2.__dict__) print(obj3,obj3.__dict__)
运行结果
{'ip':'192.168.13.98','port':3306}
{'ip':'1.1.1.3','port':80}
五、重写__new__()
classMySQL3(object): __instance=None __first_init=True def__init__(self,ip,port): ifself.__first_init: self.ip=ip self.port=port self.__first_init=False def__new__(cls,*args,**kwargs): ifnotcls.__instance: cls.__instance=object.__new__(cls) returncls.__instance obj1=MySQL3(ip,port) obj2=MySQL3(ip,port) obj3=MySQL3('1.1.1.3',80) print(obj1) print(obj2,obj2.__dict__) print(obj3,obj3.__dict__)
运行结果
{'ip':'192.168.13.98','port':'3306','_MySQL3__first_init':False}
{'ip':'192.168.13.98','port':'3306','_MySQL3__first_init':False}
注:前四种可以实现单例模式,但都不是绝对单例模式,可以创建新的对象,但是第五种方式是绝对单例模式,全局只能真正创建一次对象
以上就是python实现单例模式的5种方法的详细内容,更多关于python单例模式的资料请关注毛票票其它相关文章!