pin_drop当前位置:知识文库 ❯ 图文
Python装饰器 - 函数功能扩展技巧
概述
装饰器是Python中一种强大的语法,用于在不修改函数代码的情况下扩展函数的功能。装饰器本质上是一个函数,它接收一个函数作为参数,返回一个新函数。使用@语法糖可以简洁地应用装饰器。
语法
代码示例
@decorator
def func():
pass手动应用装饰器
代码示例
def my_decorator(func):
def wrapper():
print("函数调用前")
result = func()
print("函数调用后")
return result
return wrapper
def say_hello():
print("Hello!")
say_hello = my_decorator(say_hello)
say_hello()使用@语法糖
代码示例
def my_decorator(func):
def wrapper():
print("函数调用前")
result = func()
print("函数调用后")
return result
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()装饰带参数的函数
代码示例
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 耗时: {end-start:.4f}秒")
return result
return wrapper
@timer
def slow_function():
import time
time.sleep(1)
print("函数执行完毕")
slow_function()注意事项
提示:装饰器是接收函数、返回函数的函数。@语法糖等价于手动应用装饰器。装饰器可以在不修改原函数的情况下扩展功能。wrapper函数应使用*args, **kwargs接收任意参数。
小结
-
装饰器本质:装饰器是接收函数、返回函数的函数
-
@语法糖:@语法糖等价于手动应用装饰器
-
功能扩展:装饰器可以在不修改原函数的情况下扩展功能
-
参数传递:wrapper函数应使用*args, **kwargs接收任意参数
小贴士
装饰器是Python中最强大的特性之一,广泛应用于日志记录、性能测试、权限验证、缓存等场景。学习装饰器需要理解闭包和高阶函数的概念。掌握装饰器可以写出更优雅、更可维护的代码。
练习题
练习1
编写装饰器log_calls记录函数调用
练习2
编写装饰器check_positive确保参数为正数
常见问题
装饰器的本质是什么?
装饰器本质上是一个函数,它接收一个函数作为参数,返回一个新的函数。装饰器允许你在不修改原函数代码的情况下,为其添加额外的功能。
@语法糖的作用是什么?
@语法糖是一种简洁的装饰器应用方式,它等价于手动将函数作为参数传递给装饰器并重新赋值。例如`@decorator`等价于`func = decorator(func)`。
为什么wrapper函数要使用*args和**kwargs?
使用*args和**kwargs可以让装饰器适配任何参数形式的函数,包括位置参数、关键字参数和默认参数。这使得装饰器具有通用性,可以应用于各种函数。
装饰器有哪些常见应用场景?
装饰器常用于日志记录、性能测试(计时)、权限验证、缓存、重试机制、输入验证等场景。它们可以在不修改业务逻辑代码的情况下,为函数添加横切关注点。
本文涉及AI创作
内容由AI创作,请仔细甄别