装饰器深入专项测试
考察知识点
- 装饰器原理:函数替换、闭包应用、functools.wraps
- 带参数装饰器:装饰器工厂、三层嵌套结构
- 类装饰器:__call__方法、类作为装饰器
- 装饰器叠加:执行顺序、functools.wraps保持元信息
functools.wraps用于保留被装饰函数的元信息(name、__doc__等),如果不使用wraps,装饰后的函数会丢失原始函数的名称和文档字符串。
functools.wraps应该放在装饰器的哪个位置?
@functools.______(func)装饰_______函数。保留______、______、______等元信息。不使用wraps,__name__变成_______。wraps是_______的简化版本。使用wraps便于______和______生成。always copy ______属性。
多个装饰器堆叠时,执行顺序是从下往上装饰,从上往下执行。靠近函数定义的装饰器先应用,靠近函数调用的装饰器最后应用。
@outer
@inner
def func():
pass
装饰器的应用顺序是:
多个装饰器堆叠:@______装饰@______装饰func。等价于func ______ ______(______(func))。装饰顺序从______往______。执行顺序从______往______。靠近函数定义的______装饰。
带参数的装饰器需要三层嵌套:最外层接收装饰器参数,中间层接收被装饰函数,最内层是实际执行的wrapper函数。@decorator(arg)实际上是调用decorator(arg)返回一个装饰器。
@decorator('arg')
def func():
pass
这相当于:
带参数装饰器需要______嵌套。第______层接收装饰器______。第______层接收______。第______层是_______。@repeat(3)等价于repeat(______)(______)。参数在______层函数传入。使用wraps保留元信息在_______上。
类可以作为装饰器使用,需要实现__call__方法使类实例可调用。类装饰器相比函数装饰器更容易维护状态,适合需要记录调用次数、缓存结果等场景。
类装饰器必须实现哪个方法才能使实例像函数一样被调用?
类装饰器需实现______接收______和______使实例______。______可保存在实例______中。@Timer装饰后func变为______实例。调用func()实际调用______方法。适合______、______等需保持状态的场景。使用______________保留元信息。
状态保持装饰器可以在多次调用之间保存状态信息,实现方式包括使用闭包(函数内部变量)、类实例属性或函数属性(func.state)。
在闭包装饰器中修改外层变量,需要使用哪个关键字?
闭包保存状态用________修改外层变量。函数属性用_______.!3_count!!保存状态。类装饰器用______.!5_count!!保存状态。闭包状态______,函数属性______,类状态______。适合______、______、______等场景。
注册型装饰器用于将函数注册到某个集合中,常用于实现插件机制、路由注册、事件处理器注册等。装饰器本身不需要修改函数行为,只需记录函数引用。
注册型装饰器应该返回什么?
注册装饰器将函数加入______或______。返回______不修改行为。handlers[______._____________] ______ func记录函数。PLUGINS'______'调用注册函数。用于______、______、______注册。Flask的@app.______是典型应用。
📝 发现内容有误?点击此处直接编辑
长按或扫描二维码,立即体验