首页/ 学科题库/ python/ 装饰器深入专项测试
python 模拟试卷

装饰器深入专项测试

18 题 40 分钟 难度:★★
  • 装饰器原理:函数替换、闭包应用、functools.wraps
  • 带参数装饰器:装饰器工厂、三层嵌套结构
  • 类装饰器:__call__方法、类作为装饰器
  • 装饰器叠加:执行顺序、functools.wraps保持元信息

试卷习题(18 题)

参考答案在文末
判断题
1
判断题

带参数的装饰器需要三层嵌套:最外层接收装饰器参数,中间层接收被装饰函数,最内层是实际执行的wrapper函数。@decorator(arg)实际上是调用decorator(arg)返回一个装饰器。

A

对

B

错

2
判断题

注册型装饰器用于将函数注册到某个集合中,常用于实现插件机制、路由注册、事件处理器注册等。装饰器本身不需要修改函数行为,只需记录函数引用。

A

对

B

错

3
判断题

状态保持装饰器可以在多次调用之间保存状态信息,实现方式包括使用闭包(函数内部变量)、类实例属性或函数属性(func.state)。

A

对

B

错

4
判断题

多个装饰器堆叠时,执行顺序是从下往上装饰,从上往下执行。靠近函数定义的装饰器先应用,靠近函数调用的装饰器最后应用。

A

对

B

错

5
判断题

functools.wraps用于保留被装饰函数的元信息(name、__doc__等),如果不使用wraps,装饰后的函数会丢失原始函数的名称和文档字符串。

A

对

B

错

6
判断题

类可以作为装饰器使用,需要实现__call__方法使类实例可调用。类装饰器相比函数装饰器更容易维护状态,适合需要记录调用次数、缓存结果等场景。

A

对

B

错

单选题
7
单选题
Python
@outer
@inner
def func():
    pass

装饰器的应用顺序是:

A

outer → inner

B

inner → outer

C

同时应用

D

随机顺序

8
单选题
Python
@decorator('arg')
def func():
    pass

这相当于:

A

func = decorator(func, 'arg')

B

func = decorator('arg')(func)

C

func = decorator(func)('arg')

D

func = decorator('arg', func)

9
单选题

类装饰器必须实现哪个方法才能使实例像函数一样被调用?

A

init

B

call

C

invoke

D

decorate

10
单选题

在闭包装饰器中修改外层变量,需要使用哪个关键字?

A

global

B

nonlocal

C

outer

D

closure

11
单选题

functools.wraps应该放在装饰器的哪个位置?

A

装饰器函数开头

B

wrapper函数定义前作为装饰器

C

函数调用时

D

return语句中

12
单选题

注册型装饰器应该返回什么?

A

wrapper函数

B

原函数本身

C

None

D

注册表

填空题
13
填空题

带参数装饰器需要嵌套。第层接收装饰器。第二层接收func。第三层是wrapper。@repeat(3)等价于repeat(3)(func)。参数在最外层函数传入。使用wraps保留元信息在wrapper上。

14
填空题

多个装饰器堆叠:@装饰@装饰func。等价于func outer(inner(func))。装饰顺序从下往上。执行顺序从外往内。靠近函数定义的先装饰。

15
填空题

类装饰器需实现接收和使实例可调用。state可保存在实例属性中。@Timer装饰后func变为Timer实例。调用func()实际调用call方法。适合计数、缓存等需保持状态的场景。使用update_wrapper保留元信息。

16
填空题

@functools.(func)装饰函数。保留、doc、module等元信息。不使用wraps,__name__变成wrapper。wraps是partial的简化版本。使用wraps便于调试和文档生成。always copy dict属性。

17
填空题

闭包保存状态用修改外层变量。函数属性用.保存状态。类装饰器用self.count保存状态。闭包状态私有,函数属性可访问,类状态最清晰。适合计数、缓存、限流等场景。

18
填空题

注册装饰器将函数加入或。返回不修改行为。handlers[func.name] = func记录函数。PLUGINS'plugin'调用注册函数。用于插件、路由、事件注册。Flask的@app.route是典型应用。

参考答案
1.正确 2.正确 3.正确 4.正确 5.正确 6.正确 7.B 8.B 9.B 10.B 11.B 12.B 13.三层;一;参数 14.outer;inner;= 15.init;func;call 16.wraps;wrapper;name 17.nonlocal;wrapper;count 18.注册表;字典;原函数
想在手机上在线作答这套卷子?
使用微信 卷王开发者小程序/App,首页顶部扫一扫识别二维码,即可限时作答并自动判分。
了解产品 App
← 上一套 网络编程专项测试 下一套 → 运算符与表达式专项测试