簡單一個入門單例模式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)
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')