单例模式
什么是单例模式
多次实例化指向的都是同一块内存地址,拿到的都是同一个对象
节约空间
单例模式一
#通过类方法第一种方法 # class Sql(): # _instance=None # def __init__(self,port,host): # self.port=port # self.host=host # @classmethod # def get_sigoleton(cls): # import settings # if not cls._instance: # cls._instance = cls(settings.PORT, settings.HOST) # return cls._instance # # #每次调用get_sigoleton 拿到的对象都是同一个 # s1=Sql.get_sigoleton() # s2=Sql.get_sigoleton() # s3=Sql.get_sigoleton()
单例模式二
#通过装饰器:第二种方式 # def get_sigoleton(cls): # #cls就是Sql这个类 # import settings # _instance=cls(settings.PORT, settings.HOST) # # _instance=Sql(settings.PORT, settings.HOST) # def wrapper(*args,**kwargs): # if len(args)!=0 or len(kwargs)!=0: # #表示传了参数,生成新对象 # res=cls(*args,**kwargs) # return res # else: # return _instance # return wrapper # @get_sigoleton #会把下面的Sql当中参数传入,相当于:Sql=get_sigoleton(Sql) # class Sql(): # def __init__(self,port,host): # self.port=port # self.host=host # # Sql=get_sigoleton(Sql) # s1=Sql() # s2=Sql() # s3=Sql('33306','192.168.1.1') # s4=Sql('33306','192.168.1.1') # print(s1) # print(s2) # print(s3)
单例模式三
#第三种方法,通过元类 # class Mymeta(type): # # def __init__(self,name,bases,dic): # # #self 是Sql类 # # import settings # # #把实例化好的对象,放到了类的名称空间 # # # self._instance=self(settings.PORT, settings.HOST) # # self._instance = object.__new__(self) # # self._instance.host=settings.HOST # # self._instance.port=settings.PORT # # def __call__(self, *args, **kwargs): # # #self是谁?是Sql类 # # if len(args)!=0 or len(kwargs)!=0: # # obj=object.__new__(self) # # obj.__init__(*args, **kwargs) # # return obj # # else: # # return self._instance # # # # class Sql(metaclass=Mymeta): #相当于 Sql=Mymeta(name,bases,dic) 这个会调用 Mymeta的__init__ 在里面已经向类的名称空间放了一个对象 # # def __init__(self,port,host): # # self.port=port # # self.host=host # # # # print(Sql.__dict__) # # s1=Sql() # # #调用元类的__call__ # # s2=Sql() # # s3=Sql('33306','192.168.1.1') # # print(s1) # # print(s2) # # print(s3)
单例模式四
通过模块导入
模块会在第一次导入的时候执行一遍代码