zoukankan      html  css  js  c++  java
  • 单列模式

    简单一个入门单例模式

    单例一:调用方法发生变化

    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')
  • 相关阅读:
    Axis2 1.7.4构建项目
    MyBatis之传入参数
    eclipse快捷键
    WEB-INF目录下的jsp页面如何访问?
    web-content和web-info目录问题
    http响应报文和http请求报文 详细信息
    极光推送知识点2
    极光推送别名、标签怎么理解
    推送的通知和自定义消息区别
    个推
  • 原文地址:https://www.cnblogs.com/zcqdream/p/6764924.html
Copyright © 2011-2022 走看看