单例模式三种实现方式:
单例模式:单例模式是解决系统资源浪费的一种方案,是指一个类实例化后可以多次使用此对象。
单例模式应用场景:数据库操作、日志、后台打印
# settings.py# Host='127.0.01'# Port=8888 #方法一: 利用自定义元类来 控制对象的生成。class Mymeta(type): def __init__(self, class_name, class_base, class_dic): ''' :param class_name: 类名 :param class_base: 基类 :param class_dic: 名称空间 ''' obj = self.__new__(self)#创建新的对象 self.__init__(obj, settings.Host, settings.Port) self.__instance = obj super(Mymeta, self).__new__(class_name, class_name, class_dic) def __call__(self, *args, **kwargs): # 对象后加括号触发 obj() if not (args and kwargs): return self.__instance obj = self.__new__(self) self.__init__(obj, *args, **kwargs) return obj class Mysql(metaclass=Mymeta): def __init__(self, Host, Port): self.Host = Host self.Port = Port # 方法二:利用类的绑定方法 class Mysql: __instance = None def __init__(self, Host, Port): self.Host = Host self.Port = Port @classmethod def single(cls, *args, **kwargs): if not (args and kwargs): if not cls.__instance: cls.__instance = cls.__init__(settings.Host, settings.Port) return cls.__instance return cls.__init__(*args, **kwargs) # 方法三:利用装饰器def single(cls): _instance = cls.__init__(settings.Host, settings.Port) def wrapper(*args, **kwargs): if not (args and kwargs): return _instance return cls.__init__(*args, **kwargs) return wrapper @singleclass Mysql: def __init__(self, Host, Port): self.Host = Host self.Port = Port