单例模式
什么是单例模式
-
多次实例化指向的都是同一块内存地址,拿到的都是同一个对象
-
节约空间
单例模式一
#通过类方法第一种方法
# 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)
单例模式四
通过模块导入
模块会在第一次导入的时候执行一遍代码