python __new__()的理解

最近在学python做接口自动化,在封装log模块时,老师没有继承logging模块,而是在自己封装的MyLogger类中的__new__方法中返回了一个logging对象
自己封装的MyLogger类中就只有一个__new__方法.
问题1. 为什么不继承logging模块的类?未解
问题2. 为什么不放在__init__方法中?因为不用继承logging模块的Logger类的方法,但MyLogger实例又能直接调用logging模块的所有方法,只能在__new__创建实例的时候,把logging的实例返回

import logging


COLLECT_LEVEL = "DEBUG"
STREAM_LEVEL = "DEBUG"
FILE_LEVEL = "DEBUG"
LOG_FILE = "mylog.log"
LOG_FORMAT = "%(asctime)s  [%(filename)s  line:%(lineno)d] %(levelname)s : %(message)s"


class MyLogger:
    """封装一个MyLogger类,返回一个初始化好的日志收集器,已定义好输出渠道和日志级别,日志格式"""
    def __new__(cls):
        """封装MyLogger类是为了获得一个已经初始化好的日志收集器,
        所以直接在__new__初始化实例时就返回一个初始化好的日志收集器,这样最简洁
        不能放在__init__是因为__init__不能有return"""
        # 1.获得日志收集器,设置收集级别
        logger = logging.getLogger("logger")
        logger.setLevel(COLLECT_LEVEL)

        # 2.设置输出渠道,包括控制台输出和日志输出,及日志格式,日志级别
        sh = logging.StreamHandler()
        fh = logging.FileHandler(LOG_FILE)
        sh.setLevel(STREAM_LEVEL)
        fh.setLevel(FILE_LEVEL)
        fmt = logging.Formatter(LOG_FORMAT)
        sh.setFormatter(fmt)
        fh.setFormatter(fmt)

        # 3.添加输出渠道到日志收集器
        logger.addHandler(sh)
        logger.addHandler(fh)

        # 4.返回日志收集器.放这些放在__new__里面,实际实例化的是一个logging的对象,而不是MyLogger对象,所以可以调用logging中的任何方法
        return logger


# 封装这个类主要是为了拿到日志收集器,直接在模块中实例化这个类,from MyLogger import mylog 对象即可
my_logger = MyLogger()

if __name__ == "__main__":
    my_logger.debug("这是debug级别日志")
    my_logger.critical("这是critical级别日志")
posted @ 2023-03-04 17:53  2019勇往直前  阅读(14)  评论(0编辑  收藏  举报