• 单例模式


    单例模式就是在多次实例化后得到的是同一个实例

    实现单例的第一种方式:

    class Mysql:
        def __init__(self,ip,port):
            self.ip = ip
            self.port = port
    
        @classmethod
        def from_conf(cls):
            if not hasattr(cls,'_Mysql__instance'):
                cls.__instance =  cls(settings.IP,settings.PORT)
            return cls.__instance

    或者:

    class Mysql:
        __instance = None
        def __init__(self,ip,port):
            self.ip = ip
            self.port = port
    
        @classmethod
        def from_conf(cls):
            if cls.__instance is None:
                cls.__instance =  cls(settings.IP,settings.PORT)
            return cls.__instance

    实现单例的第二种方式:

    def foo(cls):
        __instance = cls(settings.IP,settings.PORT)
        def wrapper(*args,**kwargs):
            if args or kwargs:
                obj = cls(*args,**kwargs)
                return obj
            return __instance
        return wrapper
    
    @foo
    class Mysql:
        __instance = None
        def __init__(self,ip,port):
            self.ip = ip
            self.port = port

    实现单例的第三种方法:

    利用元类,来控制类的实例化的过程,在实例化过程中不传参数的时候都指向同一个实例

    class Mymeta(type):
        def __init__(self,class_name,class_base,class_dic):
            self.__instance = self(settings.IP,settings.PORT)
        def __call__(self, *args, **kwargs):
            if args or kwargs:
                obj = self.__new__(self)
                self.__init__(obj,*args,**kwargs)
                return obj
            else:
                return self.__instance
    
    class Mysql(metaclass=Mymeta):
        __instance = None
        def __init__(self,ip,port):
            self.ip = ip
            self.port = port

    实现单例的第四种方法:

    利用导模块的方法实现单例,因为在模块被导入的时候就产生一次名称空间

    # 在文件singleton.py中写一个类并且实例化
    class Mysql: def __init__(self,ip,port): self.ip = ip self.port = port instance = Mysql('1.1.1.1',3306) # 在别的文件中 from singleton import instance
  • 相关阅读:
    Linux目录管理常用指令
    生成器
    Python上的MVC和MVT理解,请求头,请求体,请求行的理解
    sellect、poll、epoll
    冒泡法排序
    (android / IOS)
    发现一个bug如何定位是前端还是后台问题?
    ANR----以及如何定位是前端问题还是后台问题?
    给你一个web端项目你如何展开测试?
    给你一个app你如何展开测试?
  • 原文地址:https://www.cnblogs.com/zhaijihai/p/10413785.html
Copyright © 2020-2023  润新知