單列模式

簡單一個入門單例模式spa

單例一:調用方法發生變化

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執行code

簡易1:orm

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__方法構造出來的blog

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')
相關文章
相關標籤/搜索