装饰器的作用,以及给装饰器添加参数

一.装饰器的作用

装饰器可用于修改或拓展函数或方法,通常用于在不修改原始函数代码的情况下,添加额外的功能、行为或逻辑。常见用途有:

1.代码复用:装饰器可以定义一些通用的功能,并将其应用于多个函数,从而实现代码的复用。

2.日志记录:用装饰器来记录函数的调用时间、参数和返回值,以便进行调试和性能分析。

3.权限检查:用于检查用户是否有足够的权限进行某个操作,从而进行访问控制。

4.性能优化:装饰器可用于缓存函数的结果,避免重复计算,提高程序性能。

5.异常处理:装饰器可用于捕获函数内部的异常,并进行相应处理。

6.参数验证:用于验证函数的输入参数是否符合预期,从而提高代码的鲁棒性。

7.缓存:装饰器可用于实现缓存机制,将函数的结果缓存起来,提高程序的运行效率。

示例:记录函数的执行时间

import time

def time_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"function {func.__name__} took {end_time - start_time:.4f} seconds to execute.")
        return result
    return wrapper

@time_decorator
def example_func():
    time.sleep(3)

#调用被装饰的函数
example_func()

在这里使用语法糖@time_decorator等价于:

def example_func()
    time.sleep(2)

example_func = time_decorator(example_func)
example_func()

注意:多个装饰器可以同时用在一个函数上:

@add
@square
def func():
    ...

在这里先调用square,后调用add

二.如何给装饰器传递参数

1.装饰器工厂函数:创建一个装饰器工厂函数,该工厂函数接收参数并返回一个真正的装饰器函数

def decorator_factory(param):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"Decorator with parameter {param} is applied to {func.__name__}")
            result = func(*args,**kwargs)
            return result
        return wrapper
    return decorator


@decorator_factory(param = "some_value")
def myfunc():
    print("hello")

myfunc()

2.使用偏函数:使用functools.partial船舰一个偏函数,将函数传递给他,并将其应用于装饰器

from functools import partial

def decorator(param, func):
    def wrapper(*args, **kwargs):
        print("...")
        result = func(*args, **kwargs)
        return result
    return wrapper

myfunc = partial(decorator, param = "some_value")(myfunc)
myfunc()

3.使用类作为装饰器:定义一个类作为装饰器,该类的“__init__”方法接收参数。”__call__“方法用于实现装饰逻辑。

class Mydecorator:
    def __init__(self, param):
        self.param = param

    def __call__(self, func):
        def wrapper(*args, **kwargs):
            print("hello")
            result(*args, **kwargs)
            return result
        return wrapper

@Mydecorator(param = "some_value")
def myfunc():
    print("hello")

myfunc()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值