• 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)
    

    单例模式四

    通过模块导入

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

  • 相关阅读:
    MySQL核心知识学习之路()
    软件设计之路(5)
    软件设计之路(4)
    软件设计之路(4)
    软件设计之路(3)
    软件设计之路(2)
    软件设计之美-软件设计之路
    js将 “2021-07-06T06:23:57.000+00:00” 转换为年月日时分秒
    git pull/push 拉取/推送指定分支的代码
    git clone 指定分支的代码
  • 原文地址:https://www.cnblogs.com/ledgua/p/11527844.html
Copyright © 2020-2023  润新知