欢迎访问宙启技术站
智能推送

装饰器在Python函数中的作用及应用案例

发布时间:2023-06-08 17:47:13

装饰器在Python中作为一种高级语法特性,常用于对函数、方法和类进行修改、修饰、拓展、封装等操作,其主要作用是在不改变函数结构和调用方式的前提下,动态地增加或修改函数的功能。

1. 修饰函数的功能:

装饰器可以轻松实现函数的功能修饰,比如:函数执行时间、函数执行次数、缓存结果等。例如:

# 定义带有装饰器的函数
import time

def time_consuming(func):
    def wrapper(*args,**kwargs):
        start_time=time.time() # 记录开始时间
        result=func(*args,**kwargs) # 执行函数
        end_time=time.time() # 记录结束
        print("函数%s运行时间为%f秒"%(func.__name__,end_time-start_time))
        return result
    return wrapper

#装饰目标函数
@time_consuming
 def test():
     print("this is the test function")

#调用原函数(该函数已被上面的装饰器装饰)
test()

2. 提高代码复用性:

使用装饰器可以将一些功能统一处理,从而方便代码重复使用的问题。例如:

# 定义带有装饰器的函数
def access_control(func):
    def wrapper(*args,**kwargs):
        print("开始执行函数")
        # 执行权限校验
        if check_permission():
            # 执行原函数
            result=func(*args,**kwargs)
            # 记录日志
            logger.info("函数%s执行成功"%(func.__name__))
            return result
        else:
            logger.warning("您没有执行函数%s的权限"%(func.__name__))
    return wrapper

#装饰目标函数
@access_control
 def test():
     print("this is the test function")

#调用函数
test()

3. 拓展函数的功能:

使用装饰器可以方便地拓展函数功能。例如:

# 定义装饰器
def login_required(func):
    def wrapper(*args,**kwargs):
        user=request.get("user",None)
        if user:
            return func(*args,**kwargs)
        else:
            return redirect("login")
    return wrapper

#使用装饰器
@login_required
 def dashboard():
     return "Hello Dashboard!"

#访问dashboard函数需要登录,否则将重定向到登录页面

4. 更好的异常捕获:

使用装饰器可以方便地捕获函数中的异常,并将其输出、记录。例如:

# 定义装饰器
def exception_handler(func):
    def wrapper(*args,**kwargs):
        try:
            result=func(*args,**kwargs)
            return result
        except Exception as e:
            logger.error("函数%s执行出错: %s",(func.__name__,str(e)))
            return None
    return wrapper

#使用装饰器
@exception_handler
 def test():
     raise Exception("测试一下函数异常捕获")

#函数被调用后会将捕获到的异常写入日志
test()

总结:

使用装饰器可以方便的实现函数增强、功能修饰、代码重用等,是Python中常用的高级语法特性之一。在编程中使用合适的装饰器能够极大的提高编程效率以及代码可读性,我相信在你的日常开发中,一定会经常用到装饰器这个特性。