作者:wyf叶子_594 | 来源:互联网 | 2024-12-18 14:39
深入理解装饰器
装饰器的基本概念
装饰器是Python中一种非常有用的设计模式,用于扩展或修改其他函数或方法的行为,而无需直接修改其源代码。装饰器本质上是一个返回函数的高阶函数,它可以对原始函数进行包装,从而在不改变原函数调用逻辑的情况下添加新的功能。
例如,如果我们有一个简单的函数 index()
,我们可以通过装饰器为其添加计时功能,而不改变 index()
的定义或调用方式。
装饰器的简易实现
为了理解装饰器的工作原理,我们首先来看一个简单的例子:如何使用装饰器来统计函数的执行时间。这里需要用到Python的 time
模块来获取时间戳。
import time
def timer(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print(f'函数 {func.__name__} 执行时间: {end_time - start_time}s')
return wrapper
@timer
def index():
time.sleep(3)
print('from index')
index()
装饰器的高级实现
当被装饰的函数需要接受参数时,我们需要对装饰器进行适当的调整,以确保这些参数能够正确传递。这通常涉及到对装饰器内部的 wrapper
函数进行修改,使其能够接收并传递参数。
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f'函数 {func.__name__} 执行时间: {end_time - start_time}s')
return result
return wrapper
@timer
def index(param):
time.sleep(3)
print(f'from index with param: {param}')
index('test')
装饰器的实际应用:认证功能
装饰器不仅可以用作性能监控,还可以用于实现如用户认证等功能。例如,我们可以创建一个装饰器,确保在调用特定函数前检查用户的登录状态。
def auth_required(func):
def wrapper():
username = input('请输入用户名: ')
password = input('请输入密码: ')
if username == 'admin' and password == '123456':
func()
else:
print('认证失败')
return wrapper
@auth_required
def admin_panel():
print('欢迎来到管理员面板')
admin_panel()
装饰器的固定模式
装饰器的固定模式通常包括一个外部函数和一个内部函数。外部函数接收被装饰的函数作为参数,内部函数则负责执行实际的增强逻辑,并最终调用被装饰的函数。
def outer_decorator(func):
def inner_decorator(*args, **kwargs):
print('函数执行前的操作')
result = func(*args, **kwargs)
print('函数执行后的操作')
return result
return inner_decorator
装饰器的语法糖
Python 提供了一种称为“语法糖”的简洁方式来使用装饰器。通过在函数定义前加上 @decorator_name
,可以自动将该函数作为参数传递给装饰器函数,并将装饰器的返回值(即新的函数)赋值给原函数名。
@outer_decorator
def some_function():
print('这是被装饰的函数')
some_function()