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单例模式的资料请关注毛票票其它相关文章!