首页 > 编程语言 >python __new__()的理解

python __new__()的理解

时间:2023-03-04 18:15:48浏览次数:44  
标签:__ logging python MyLogger new 日志 logger

最近在学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级别日志")

标签:__,logging,python,MyLogger,new,日志,logger
From: https://www.cnblogs.com/xiaozhuangAna/p/17178736.html

相关文章

  • c# 操作注册表
    C#读、写、删除注册表 1.首先,必须导入空间"Microsoft.Win32" 2.利用Registry类,确定注册表的分支(ClassesRoot,CurrentUser,Users,LocalMachine,CurrentConfig)usi......
  • Spring事务失效的十种常见场景
    目录概述事务的传播类型isolation@Transactionnal注解属性Spring事务失效的场景:1.事务方法未被Spring管理2.方法使用final类型修饰3.非public修饰的方法4.同一个类中......
  • 2.JavaScript如何实现异步编程,可以详细描述EventLoop机制
    单线程和异步js的任务分为同步和异步两种,它们的处理方式也不同,同步任务是直接在主线程上排队执行,异步任务则会被放在任务队列中,若有多个任务(异步任务)则要在任务队列中排......
  • 如何在 OpenEuler 系统中安装 Docker
    Docker是一种流行的开源容器化平台,它能够将应用程序与其依赖项打包成可移植的容器,从而简化了应用程序的部署和管理。本文将介绍在OpenEuler系统中安装Docker并使用Do......
  • 3月4日 天气晴
    今天天气很热,上午七点多醒了,但是上个厕所回来又困了,所以睡到了十点,一看,进击的巨人最终季出了,不墨迹直接巨人,看了一小时之后饿了,跟龙出去吃了一碗骨汤面,回来买了水果和牛奶......
  • java 线程常用方法
    方法名作用特点start()启动线程,线程进入可运行状态不是立马执行,还需要等一个时机,等抢到CPU调度权就执行join()加入线程,等加入的线程执行结束再执行当前......
  • TRUNCATE、DELETE、DROP的区别
    Truncate、delete、drop区别一、Truncate使用truncateuser_table;清空表的数据,但不破坏表结构二、delete使用deletefromuser_tablewhereid=1;删除指定数据,要......
  • 记录--在Vue3这样子写页面更快更高效
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分......
  • Lua 学习---2
    值和类型 Luaisa dynamicallytypedlanguage.Thismeansthatvariablesdonothavetypes;onlyvaluesdo.Therearenotypedefinitionsinthelanguage.A......
  • Wandering(1)
    分布式缓存CDN反向代理本地分布式ConcurrentHashMap解决HashMap并发死循环hashmap并发死循环原理参考用例前提:线程1进行到了扩容后的第一步,记录当前节点为3,下一......