Python单例模式实现日志功能
1、打开python开发工具IDLE,新建‘Sin.py’文件,为方便理解先做一个函数装饰器,代码如下:def decr(fun): def addstr(ar): return 'hello'+fun(ar) return addstr@decrdef innerfun(s): return sprint (innerfun('world'))解释一下:innerfun是传入decr装饰器的函数,可以理解为函数指针fun,其参数传入的是decr内层函数addstr,最后得到的字符串就是addstr函数作用之后的了,在返回给innerfun函数
2、F5运行程序,打印出‘hello world’
3、再创建一个‘SinCls.py’文件,编写单例模式装饰器,代码如下:def singlecls(cobj): _instance = {} def createCobj(): if cobj not in _instance: _instance[cobj] = cobj() return _instance[cobj] return createCobj解释一下_instance这个字典使用类的地址作为key,对象实例作为value。类的地址不变,第一次创建类的对象后,就不会再创建新的。
4、接下来创建一个类,并测试单例模式装饰器,完整代码如下:def singlecls(cobj): _instance = {} def createCobj(): if cobj not in _instance: _instance[cobj] = cobj() return _instance[cobj] return createCobj@singleclsclass myCls(): def __init__(self): passif __name__=='__main__': cl1 = myCls() cl2= myCls() print (id(cl1)) print (id(cl2))
5、F5运行程序,打印出两个对象实例的地址,地址一致,说明同一实例。
6、改写例子中的类,使之成为一个日志类,代码如下import loggingdef singlecls(cobj): _inst锾攒揉敫ance = {} def createCobj(): if cobj not in _instance: _instance[cobj] = cobj() return _instance[cobj] return createCobj@singleclsclass myCls(): def __init__(self): self.logger = logging.getLogger()if __name__=='__main__': cl1 = myCls() cl1.logger.warning('first warn')
7、正常的日志一般写在文件里,IO频繁这也是用单例模式的好处,这里关于日志的知识就不展开了。F5运行程序,警告信息输出到控制台