第34课:装饰器:给函数穿新衣服
函数是一等公民
在 Python 里,函数和数字、字符串一样,可以当参数传递,也可以当返回值:
💻 在 Thonny 运行:函数当参数
💻 在 Thonny 运行:函数当返回值
🖥️ 计算机小知识
把函数当变量传来传去,这不只是 Python 的花招——这是一种编程思想,叫函数式编程。
函数式编程的核心:函数像数据一样可以被创建、传递、组合。LISP(1958年)是第一个函数式语言,比 Python 早了30多年!Python 从函数式编程借鉴了很多好东西:
map()、filter()、lambda、装饰器……不同的编程思想像不同的工具:过程式 = 按步骤来,面向对象 = 分角色来,函数式 = 组合小函数来。高手会根据问题选择最合适的工具。
手写第一个装饰器
装饰器 = 接收一个函数,返回一个增强版函数:
💻 在 Thonny 运行:第一个装饰器
用 @ 语法更优雅——效果完全一样:
💻 在 Thonny 运行:@ 语法糖
装饰带参数的函数
💻 在 Thonny 运行:装饰带参数的函数
带参数的装饰器
如果装饰器自己也要接收参数,就多包一层:
💻 在 Thonny 运行:带参数的装饰器
functools.wraps
装饰器会把原函数的名字和文档覆盖掉。用 @wraps 修复:
💻 在 Thonny 运行:用 wraps 保留原函数信息
练习
💻 在 Thonny 运行:写一个 @debug 装饰器