常见装饰器的写法

 1、普通装饰器

它实现的功能是:

                在函数执行前,先记录一行日志

                在函数执行完,再记录一行日志

# 装饰器函数,参数 func 是被装饰的函数
def logger(fun):
    def my_wrapper(*args,**kwargs):
        print('装饰器开始执行!',fun.__name__)
        # 真正执行的是这行。
        res = fun(*args,**kwargs)
        print('执行完毕!')
        return res
    return my_wrapper

@logger
def my_add(x,y):
    print('{}+{}={}'.format(x,y,x+y))

my_add(3,5)


​​​​​2、不带参数的类装饰器

        装饰器本身是一个函数,做为一个函数,如果不能传参,那这个函数的功能就会很受限,只能执行固定的逻辑。这意味着,如果装饰器的逻辑代码的执行需要根据不同场景进行调整,若不能传参的话,我们就要写两个装饰器,这显然是不合理的。

必须要实现 __init__(接收被装饰函数) 和 __call__(实现装饰逻辑) 两个方法
class no_logger_class:
    def __init__(self,func):
        self.func = func
    def __call__(self,*args, **kwargs):
        print('======第三种=======')
        print(f'[INFO]正在执行{self.func.__name__}')
        self.func(*args,**kwargs)

@no_logger_class
def no_my_wrapper(something):
    print('say {}!'.format(something))
no_my_wrapper('hello')

3、带参数的类装饰器

        上面不带参数的例子,你发现没有,只能打印INFO级别的日志,正常情况下,我们还需要打印DEBUG WARNING等级别的日志。 这就需要给类装饰器传入参数,给这个函数指定级别了。

        此时 __init__ :不再接收被装饰函数,而是接收传入参数。 __call__ :接收被装饰函数,实现装饰逻辑。

class logger_class:
    def __init__(self,level='INFO'):
        self.lever = level
    def __call__(self, func):
        def my_wrapper(*args, **kwargs):
            self.func = func
            print(f'[{self.lever}]正在执行{self.func.__name__}')
            return func(*args,**kwargs)
        return my_wrapper

@logger_class(level='WARNING')
def my_wrapper(something):
    print('say {}!'.format(something))
my_wrapper('hello')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangjiwei0207

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值