1 | __defaults__ # 保存定位参数和关键字参数的默认值 |
装饰器
两个特性
- 能把被装饰的函数替换成其他函数
- 装饰器在加载其他函数时立即执行(在被装饰的函数定义后立即执行,通常在导入时)
变量作用域规则
如果变量在函数内找不到,会从全局变量中找,如果变量在函数中被赋值,那么假定变量是局部变量
闭包
延伸了作用域的函数,包含了在函数定义体中引用、但是不在定义体中定义的非全局变量。
1 | def make_averager(): |
series是一个自由变量,即指未在本地作用域中绑定的变量
series绑定在返回的avg函数的__closure__属性中,其里面的元素对应avg.__code__.co_freevars中的一个名称,这些元素是cell对象,有个cell_contents属性保存真正的值。
闭包是一种函数,会保留定义函数时存在的自由变量的绑定,调用函数时,虽然定义作用域不可用了,但是仍然能够使用这些绑定。
nolocal
使用nolocal变量时,会将变量标记为自由变量,即使在函数中赋值,也会变成自由变量
标准库中的装饰器
functools.lru_cache
实现了备忘功能,缓存不会无限增长,一段时间内不使用的缓存条目会被扔掉
functools.singledispatch
把Java中的方法重载带入python