Python装饰器入门教程:添加函数功能

需积分: 9 0 下载量 185 浏览量 更新于2024-09-04 收藏 2KB TXT 举报
"Python装饰器是一种高级编程技巧,用于在不修改原函数代码的情况下为函数添加额外功能。装饰器本质上是接收一个函数作为参数并返回一个新的函数的高阶函数。它们在Python中广泛应用,特别是在处理日志、性能测试、缓存、权限控制等场景。 在Python中,函数是可变对象,可以被赋值给变量,也可以作为参数传递给其他函数。高阶函数是指接收一个或多个函数作为参数,并返回一个新的函数的函数。而嵌套函数则是定义在另一个函数内部的函数,它可以访问外部函数的局部变量。将高阶函数与嵌套函数结合,就可以实现装饰器的功能。 装饰器的工作原理是通过在原有函数调用前添加额外的逻辑,然后返回一个新的函数,这个新函数在执行原函数的同时,还执行了装饰器的附加操作。例如,下面的`timeer`装饰器用于计算函数的执行时间: ```python import time def timeer(func): def wrapper(): start_time = time.time() func() stop_time = time.time() print(f"the func runtime is {stop_time - start_time}") return wrapper @timeer def test1(): time.sleep(3) return 'in the test1' ``` 在这个例子中,`@timeer`语法糖使得`test1`函数被`timeer`装饰器包装,当调用`test1()`时,实际上执行的是`timeer(test1)`的结果,即`wrapper`函数。`wrapper`函数在执行`test1`之前和之后记录时间,从而实现了计算运行时间的功能。 如果需要装饰的函数有参数,装饰器也需要进行相应的调整。例如: ```python def dec(func): def deo(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) stop_time = time.time() print(f"{func.__name__} runtime is {stop_time - start_time}") return result return deo def test1(name, a): time.sleep(3) print(f"Hello, {name}, this is test1 with argument {a}") test1 = dec(test1) ``` 在这个例子中,`deo`函数接收任意数量的位置参数`*args`和关键字参数`**kwargs`,以便适应不同参数的函数。装饰后的`test1`函数仍然可以正常接收参数,并且在执行前后记录运行时间。 总结来说,Python装饰器是一种强大的工具,能够帮助我们优雅地扩展函数的功能,同时保持代码的整洁和模块化。通过理解装饰器的工作原理和使用方法,开发者可以更高效地利用Python进行复杂的程序设计。"