Python 单例模式

单例模式

什么是单例模式

  • 多次实例化指向的都是同一块内存地址,拿到的都是同一个对象

  • 节约空间

单例模式一

#通过类方法第一种方法
# 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)

单例模式四

通过模块导入

模块会在第一次导入的时候执行一遍代码

原文地址:https://www.cnblogs.com/ledgua/p/11527844.html