单列模式
简单一个入门单例模式
单例一:调用方法发生变化
class Foo(object): _i = None @classmethod def instance(cls): if cls._i: return cls._i else: obj = Foo() cls._i = obj return cls._i obj1 = Foo.instance() #只能用这个方法去调用!!其他不行 obj2 = Foo.instance()
单例二: 用于协同开发的时候,调用方法并没有变
一步一步来
这里使用了__new__方法. new方法先于init执行
简易1:
class Foo(object): _i = None def __init__(self): #5 #self也就是o self.n = 123 def __new__(cls, *args, **kwargs): #2 #这里的cls就是FOO o = object.__new__(cls,*args, **kwargs) #3 #通过object去创建对象!,真正的在内存中创建对象 return o #4 obj=Foo() #1 #这里的obj也就是o
升级2:
用__new__方法构造出来的
class Foo(object): _i = None def __init__(self): self.n = 123 def __new__(cls, *args, **kwargs): if cls._i: return cls._i else: o = object.__new__(cls,*args, **kwargs) cls._i = o return cls._i obj1 = Foo() obj2 = Foo() obj3 = Foo() print(obj1,obj2,obj3)
CMDB项目日志功能
class LoggerHelper(object): _i = None # _i 属于静态字段(这个可以随便写),这个静态属于类,在类里只保存一份,第一次运行的时候,就会重新赋值,这里如何都会执行 cls._i = LoggerHelper()
#如果第二次进来,它就拿第一次创建的对象,不管执行多少遍,永远都是同一个值 @classmethod def instance(cls): #cls就是这个类名 if cls._i: return cls._i else: cls._i = LoggerHelper() #LoggerHelper() return cls._i # obj obj=LoggerHelper.instance() print(obj)
这里我们在进行一下扩展
class LoggerHelper(object): _i = None @classmethod def instance(cls): if cls._i: return cls._i else: cls._i = LoggerHelper() #LoggerHelper() return cls._i # obj def __init__(self): #创建文件对象 error_log = logging.FileHandler('error.log', 'a+', encoding='utf-8') fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") error_log.setFormatter(fmt) # 创建日志对象 error_logger = logging.Logger('error', level=logging.ERROR) # 日志对象和文件对象创建关系 error_logger.addHandler(error_log) self.error_logger = error_logger # 创建文件对象 run_log = logging.FileHandler('run.log', 'a+', encoding='utf-8') fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") run_log.setFormatter(fmt) # 创建日志对象 run_logger = logging.Logger('run', level=logging.ERROR) # 日志对象和文件对象创建关系 run_logger.addHandler(run_log) self.run_logger = run_logger if __name__ == '__main__': # 单例模式,用户获得第一次创建的对象 obj1 = LoggerHelper.instance() obj1.error_logger.log(logging.FATAL,'a1') obj2 = LoggerHelper.instance() obj2.run_logger.log(logging.FATAL,'a2') obj3 = LoggerHelper.instance() obj3.run_logger.log(logging.FATAL,'a3')