Python单例模式实现日志功能

2025-10-03 08:13:35

1、打开python开发工具IDLE,新建‘Sin.py’文件,为方便理解先做一个函数装饰器,代码如下:

def decr(fun):

    def addstr(ar):

        return 'hello'+fun(ar)

    return addstr

@decr

def innerfun(s):

    return s

print (innerfun('world'))

解释一下:

innerfun是传入decr装饰器的函数,可以理解为函数指针fun,其参数传入的是

decr内层函数addstr,最后得到的字符串就是addstr函数作用之后的了,在返回给

innerfun函数

Python单例模式实现日志功能

2、F5运行程序,打印出‘hello world’

Python单例模式实现日志功能

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。类的地址不变,第一次创建类的对象后,就不会再创建新的。

Python单例模式实现日志功能

4、接下来创建一个类,并测试单例模式装饰器,完整代码如下:

def singlecls(cobj):

    _instance = {}

    def createCobj():

        if cobj not in _instance:

            _instance[cobj] = cobj()

        return _instance[cobj]

    return createCobj

@singlecls

class myCls():

    def __init__(self):

        pass

if __name__=='__main__':

    cl1 = myCls()

    cl2= myCls()

    print (id(cl1))

    print (id(cl2))

Python单例模式实现日志功能

5、F5运行程序,打印出两个对象实例的地址,地址一致,说明同一实例。

Python单例模式实现日志功能

6、改写例子中的类,使之成为一个日志类,代码如下

import logging

def singlecls(cobj):

    _instance = {}

    def createCobj():

        if cobj not in _instance:

            _instance[cobj] = cobj()

        return _instance[cobj]

    return createCobj

@singlecls

class myCls():

    def __init__(self):

        self.logger = logging.getLogger()

if __name__=='__main__':

    cl1 = myCls()

    cl1.logger.warning('first warn')

Python单例模式实现日志功能

7、正常的日志一般写在文件里,IO频繁这也是用单例模式的好处,这里关于日志的知识就不展开了。F5运行程序,警告信息输出到控制台

Python单例模式实现日志功能

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢