全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📝 1 篇文章 18 道配套习题

装饰器深入专题

专题说明

装饰器是Python中最强大的语法特性之一。本专题从装饰器的底层原理出发,深入讲解无参装饰器、带参装饰器、类装饰器、多重装饰器的组合使用、装饰器执行顺序以及functools.wraps的正确使用,帮助学习者全面掌握装饰器的设计模式和应用场景。

学习目标

  1. 理解装饰器的本质和底层原理
  2. 掌握无参装饰器和带参装饰器的实现
  3. 理解类装饰器的实现方式
  4. 掌握多重装饰器的组合和执行顺序
  5. 熟练使用functools.wraps保留函数元信息

学习内容

本专题涵盖以下核心知识点:

装饰器原理

  • 装饰器的本质:高阶函数
  • 函数对象与闭包的应用
  • @语法糖的展开过程

无参装饰器

  • 基本装饰器模板
  • *args和**kwargs的使用
  • 装饰器嵌套

带参装饰器

  • 三层嵌套函数结构
  • 装饰器参数的传递
  • 常见带参装饰器场景

类装饰器

  • 使用__call__实现
  • 类装饰器与函数装饰器的对比

多重装饰器

  • 装饰器的堆叠效果
  • 执行顺序:自底向上装饰,自顶向下执行
  • 常见多重装饰器组合

functools.wraps

  • 函数元信息的保留
  • wraps的实现原理
  • 不使用wraps的后果

学习建议

  1. 理解装饰器本质是函数的高阶应用
  2. 掌握装饰器的模板代码,能灵活变换
  3. 注意多重装饰器的执行顺序
  4. 始终使用functools.wraps保留元信息

📝 发现内容有误?点击此处直接编辑

📝 配套习题(18 题)

1
判断题

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

A

B

2
单选题

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

A

装饰器函数开头

B

wrapper函数定义前作为装饰器

C

函数调用时

D

return语句中

3
填空题

@functools.______(func)装饰_______函数。保留__________________等元信息。不使用wraps,__name__变成_______。wraps是_______的简化版本。使用wraps便于____________生成。always copy ______属性。

4
判断题

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

A

B

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

装饰器的应用顺序是:

A

outer → inner

B

inner → outer

C

同时应用

D

随机顺序

6
填空题

多个装饰器堆叠:@______装饰@______装饰func。等价于func ______ ______(______(func))。装饰顺序从____________。执行顺序从____________。靠近函数定义的______装饰。

7
判断题

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

A

B

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
填空题

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

10
判断题

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

A

B

11
单选题

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

A

init

B

call

C

invoke

D

decorate

12
填空题

类装饰器需实现______接收____________使实例____________可保存在实例______中。@Timer装饰后func变为______实例。调用func()实际调用______方法。适合____________等需保持状态的场景。使用______________保留元信息。

13
判断题

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

A

B

14
单选题

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

A

global

B

nonlocal

C

outer

D

closure

15
填空题

闭包保存状态用________修改外层变量。函数属性用_______.!3_count!!保存状态。类装饰器用______.!5_count!!保存状态。闭包状态______,函数属性______,类状态______。适合__________________等场景。

16
判断题

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

A

B

17
单选题

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

A

wrapper函数

B

原函数本身

C

None

D

注册表

18
填空题

注册装饰器将函数加入____________。返回______不修改行为。handlers[______._____________] ______ func记录函数。PLUGINS'______'调用注册函数。用于__________________注册。Flask的@app.______是典型应用。

← 上一个专题 网络编程专题
下一个专题 → 运算符与表达式专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库