20 分钟
Python 高级

带参数装饰器

编写可接受参数的装饰器

  • 理解三层嵌套装饰器
  • 编写带参数的装饰器
  • 装饰器实战应用

带参数装饰器

带参数的装饰器多了一层嵌套:外层接参数,中层接函数,内层跑逻辑。

示例代码(可运行)

权限检查装饰器

示例代码(可运行)
预测输出
def mul(n):
    def d(f):
        def w(x): return f(x)*n
        return w
    return d
@mul(3)
def f(x): return x
print(f(4))
找 Bug带参数的装饰器得三层嵌套。@repeat(3)会先调用repeat(3),返回真正的装饰器。
@repeat(3) def greet(): print("hi") # repeat定义只有两层 def repeat(func): def wrapper(): func() return wrapper
填空题填写空白处的代码
def repeat(n): def (func): def w(): pass return w return decorator
选择题

@deco(5) 等价于?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

with 语句等价于 try/finally:无论正常结束还是中途抛异常,退出时都会执行清理(关文件、释放锁、断开连接)。实现方式有两种:类里写 __enter__/__exit__,或用 contextlib.contextmanager 把生成器变成上下文管理器。凡是「打开了必须关闭/获取了必须释放」的资源,都应该用 with 托管。

挑战任务

带参装饰器挑战

简单+50 XP

实现@delay(seconds)延迟执行装饰器。

带参装饰器挑战
2 个测试用例

课后作业

缓存装饰器

中等+20 XP

实现@cache记忆化装饰器。

缓存装饰器
1 个测试用例