导图社区 装饰器
这是一篇关于装饰器的思维导图,主要内容包括:应用场景,语法糖:给语法发的糖,用@符号简化装饰器,应用,定义:是一个函数,但是可以接受函数入参,并输出一个新的函数。
编辑于2025-02-13 03:26:01这是一篇关于Deep深度思考模型的思维导图,主要内容包括:深度思考的本质不是增加信息量,而是提升信息处理质量。每次思考时给自己设置"认知过筛器":这个结论经得起哪几个学科的检验?在哪些边界条件下可能失效?是否有更底层的解释模型?通过持续追问,逐渐建立多维度、可迭代的认知体系,第8个月:形成"思维弹性",可在不同认知模式间切换,第3个月:出现"认知透视感",
这是一篇关于学霸都在用的六种笔记方法的思维导图,主要内容包括:五星笔记法,艾宾浩斯学习法,番茄钟学习法,费曼学习法,海马体背书法,康奈尔笔记法。
这是一篇关于Python学习路径的思维导图,主要内容包括:阶段 9:项目实践 学习目标:综合运用所学知识,开发实际项目。所学知识及用处:提升解决实际问题的能力。积累项目经验。阶段 8:高级主题学习目标:深入了解一些高级特性,如生成器、装饰器等。所学知识及用处:生成器:节省内存,处理大规模数据。装饰器:增强函数的功能。
社区模板帮助中心,点此进入>>
这是一篇关于Deep深度思考模型的思维导图,主要内容包括:深度思考的本质不是增加信息量,而是提升信息处理质量。每次思考时给自己设置"认知过筛器":这个结论经得起哪几个学科的检验?在哪些边界条件下可能失效?是否有更底层的解释模型?通过持续追问,逐渐建立多维度、可迭代的认知体系,第8个月:形成"思维弹性",可在不同认知模式间切换,第3个月:出现"认知透视感",
这是一篇关于学霸都在用的六种笔记方法的思维导图,主要内容包括:五星笔记法,艾宾浩斯学习法,番茄钟学习法,费曼学习法,海马体背书法,康奈尔笔记法。
这是一篇关于Python学习路径的思维导图,主要内容包括:阶段 9:项目实践 学习目标:综合运用所学知识,开发实际项目。所学知识及用处:提升解决实际问题的能力。积累项目经验。阶段 8:高级主题学习目标:深入了解一些高级特性,如生成器、装饰器等。所学知识及用处:生成器:节省内存,处理大规模数据。装饰器:增强函数的功能。
装饰器
定义:是一个函数,但是可以接受函数入参,并输出一个新的函数
应用
def my_decorator(func): def wrapper(): print("在函数调用之前做一些事情") func() print("在函数调用之后做一些事情") return wrapper
在这个例子中,my_decorator就是一个装饰器函数,它接收一个函数func作为参数,并且返回一个新的函数wrapper。wrapper函数在调用func之前和之后分别添加了一些额外的操作。
语法糖:给语法发的糖,用@符号简化装饰器
@my_decorator def say_hello(): print("Hello!")
解释: 这等价于say_hello = my_decorator(say_hello)。当调用say_hello函数时,实际上是在调用my_decorator返回的wrapper函数,从而实现了在say_hello函数调用前后添加额外操作的功能。
应用场景
日志记录
import time def log_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() print(f"调用函数 {func.__name__},参数为{args}和{kwargs}") result = func(*args, **kwargs) end_time = time.time() print(f"函数 {func.__name__} 执行时间为 {end_time - start_time} 秒") return result return wrapper @log_decorator def add_numbers(a, b): time.sleep(1) # 模拟耗时操作 return a + b
当调用add_numbers函数时,装饰器会自动记录函数的调用信息和执行时间。
权限验证
在 Web 开发中,装饰器可以用于验证用户是否有访问某个页面或执行某个操作的权限。例如:
def permission_required(role): def decorator(func): def wrapper(*args, **kwargs): user_role = get_user_role() # 假设这是一个获取用户角色的函数 if user_role == role: return func(*args, **kwargs) else: print("没有权限") return wrapper return decorator @permission_required("admin") def delete_user(user_id): print(f"删除用户 {user_id}")
只有当用户角色是admin时,才能执行delete_user函数。
带参数的装饰器
装饰器本身也可以接收参数。在上面的permission_required装饰器中,role就是装饰器的参数。它的工作原理是,当使用@permission_required("admin")时,首先会调用permission_required("admin"),返回一个装饰器函数(decorator),然后这个装饰器函数再去装饰目标函数(delete_user)。
多个装饰器的使用
一个函数可以被多个装饰器装饰。例如:
def decorator1(func): def wrapper(): print("装饰器1 - 在函数调用之前") func() print("装饰器1 - 在函数调用之后") return wrapper def decorator2(func): def wrapper(): print("装饰器2 - 在函数调用之前") func() print("装饰器2 - 在函数调用之后") return wrapper @decorator1 @decorator2 def say_hi(): print("Hi!")
当调用say_hi函数时,会按照从里到外的顺序依次应用装饰器。先应用decorator2,然后将结果应用decorator1。装饰器的执行顺序是decorator2的前置操作、decorator2调用原始函数、decorator2的后置操作,然后是decorator1的前置操作、decorator1调用经过decorator2装饰后的函数、decorator1的后置操作。