单列模式

简单一个入门单例模式

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

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

 

posted @ 2017-04-25 22:10  所有的梦想都画在墙上  阅读(217)  评论(0编辑  收藏  举报