Python入门-面向对象-装饰器

2021/8/20 17:35:43

本文主要是介绍Python入门-面向对象-装饰器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

# 方法四:定义一个装饰器接收操作函数,是由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

内置装饰器



这篇关于Python入门-面向对象-装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程