本章讨论的话题
python 如何计算装饰器句法
python 如何判断变量是不是局部的 (通过函数内部是否给变量赋值过来判断是否是局部变量)
闭包存在的原因和工作原理 (闭包是一种函数, 它会保留定义函数时存在的自由变量的绑定, 这样调用函数时, 虽然定义作用域不可用了, 但是仍能使用那些绑定. 函数中的函数)
nonlocal 能解决什么问题 (nonlocal 是新出现的保留关键字, python3.0 中引入)(将局部变量声明为自由变量)
探讨
实现行为良好的装饰器
标准库中有用的装饰器
实现一个参数化的装饰器
装饰器的基础知识
装饰器是可调用的对象, 其参数是另一个函数即被装饰的函数, 装饰器可能会处理被装饰的函数, 然后将它发返回, 或者将其替换成另一个函数或可调用对象.
@decorate
def target():
print("running target()")
以上方法效果同下
def target():
print("running target()")
target = decorate(target)
装饰器的一个特性是能把被装饰的函数替换成其他函数, 第二个特性是, 装饰器在加载模块是立即执行.
装饰器通常在一个模块中定义, 然后应用到其他模块的函数上, 并且会在内部定义一个函数, 然后将其返回
变量作用域规则
在上面的例子中我们定义了一个全局变量 b, 在函数中给 b 赋值, 导致 python 判断 b 是局部变量, 我们只定义了全局变量 b, 没有定义局部变量 b, 所以报错. 可以通过使用 global 关键词将 b 当成全局变量
LOAD_GLOBAL 加载全局变量, LOAD_FAST 加载局部变量
闭包
闭包指的是延伸了作用域的函数, 其中包含函数定义体中引用, 但是不在定义体中定义的非全局变量. 函数是不是匿名的没有关系, 关键是能访问定义体之外的非全局变量
综上, 闭包是一种函数, 它会保留定义函数是存在的自由变量的绑定, 这样调用函数时, 虽然定义作用域不可用了, 但是仍能使用那些绑定.
nonloal 声明
函数中的局部变量, 虽然可以被函数中的函数使用, 但是如果使用了赋值语句, 就需要将该局部变量定义成自由变量, nonloal 的作用就是把变量标记为自由变量.
Python2 中没有 nonlocal 但是可以通过将声明一个变量指向局部变量来对其赋值
实现简单的装饰器
标准库中的装饰器
python 内置了三个用于装饰方法的函数, property,clasmethod 和 staticmethod
另一个常见的装饰器是 functools.wraps, 作用是协助构建行为良好的装饰器.
单分派泛函数
叠放装饰器
使用两个或者多个装饰器
参数化装饰器
来源: http://www.bubuko.com/infodetail-2479057.html