装饰器
不改变原来代码和调用方式的情况下,为被装饰对象添加新的功能
能够在不修改原函数代码的基础上,在执行前后进行定制操作,闭包函数的一种应用
场景:
# 闭包函数就是内部的函数调用外部函数的变量,常用于装饰器。定义在函数内部引用了外部函数名称空间中的名字的函数。执行过程中获取到相应的数据,避免了外部干扰。
# 判断闭包函数的方法:__closure__,输出的__closure__有cell元素说明是闭包函数
# 闭包的意义与应用:延迟计算:
# 手写装饰器;
import functools
def wrapper(func):
@functools.wraps(func) #不改变原函数属性
def inner(*args, **kwargs):
执行函数前
return func(*args, **kwargs)
执行函数后
return inner
1. 执行wapper函数,并将被装饰的函数当做参数。 wapper(index)
2. 将第一步的返回值,重新赋值给 新index = wapper(老index)
@wrapper #index=wrapper(index)
def index(x):
return x+100
# ---------------------------------------------------------------
# 生成器:
一个函数内部存在yield关键字
应用场景:
- rang/xrange
- redis获取值
- conn = Redis(......)
- v=conn.hscan_iter() # 内部通过yield 来返回值
- stark组件中
- 前端调用后端的yield
# ---------------------------------------------------------------
# 迭代器:
内部有__next__和__iter__方法的对象,帮助我们向后一个一个取值,迭代器不一定是生成器
应用场景:
- wtforms里面对form对象进行循环时,显示form中包含的所有字段
- 列表、字典、元组
(可以让一个对象被for循环):