# 方法四:定义一个装饰器接收操作函数,是由python传递 def log_logging(func): def wrapper(*args, **kwargs): #获取包装函数的名称 print("方法四:这是装饰器的日志方法,当前函数为:{}".format(func.__name__)) return func(*args, **kwargs) return wrapper # 返回装饰器函数,就是闭包 class Message: @log_logging def print_title(self): print("方法一:这是print方法直接输出的日志") logging() log() #方法二:定义一个日志函数 def logging(): print("方法二:这是使用logging函数,输出的日志!!") #方法三:使用inspet模块方法,获取方法名称 def log(): import inspect res = inspect.stack()[1][3] print("方法三:这是使用inspect模块,输出的日志!当前方法为:{}".format(res)) if __name__ == '__main__': m = Message() m.print_title()
完整的日志装饰器
def log_logging(level="info"): def wrapper(func): def inner(*args, **kwargs): #获取包装函数的名称 print("【logging-{}】的日志,当前函数为:{}".format(level,func.__name__)) return func(*args, **kwargs) return inner # 返回装饰器函数,就是闭包 return wrapper class Message: @log_logging(level="DEBUG") # 设置参数 def print_title(self): print("正在使用print——title方法!") if __name__ == '__main__': m = Message() m.print_title()
基于类定义实现的装饰器
# 使用call方法 class logging: def __init__(self, level = "INFO"): self.__level = level def __call__(self, func): def inner(*args, **kwargs): # 获取包装函数的名称 print("【logging-{}】的日志,当前函数为:{}".format(self.__level, func.__name__)) return func(*args, **kwargs) return inner # 返回装饰器函数,就是闭包 class Message: @logging(level="DEBUG") def print_info(self): print("正在使用print_info的方法。") if __name__ == '__main__': m = Message() m.print_info()
"""
【logging-DEBUG】的日志,当前函数为:print_info
正在使用print_info的方法。
"""
wrapt模块
#wrapt减少嵌套层数 #先安装:pip install wrapt import wrapt @wrapt.decorator() def logging(wrapped, insrance, args, kwargs): print("【方法一:logging】的日志,当前函数为:{}".format(wrapped.__name__)) def log_log(level="INFO"): @wrapt.decorator() def log_wrapper(wrapped, insrance, args, kwargs): print("【方法二:logging-{}】的日志,当前函数为:{}".format(level,wrapped.__name__)) return wrapped(*args, **kwargs) return log_wrapper class Message: # @logging #这是方法一,两个装饰器,不能同时使用 @log_log(level="DEBUG") #这是方法二 def print_info(self): print("正在使用print_info的方法") if __name__ == '__main__': m = Message() print(m.print_info())
【方法二:logging-DEBUG】的日志,当前函数为:print_info
正在使用print_info的方法
None