装饰器

不改变原来代码和调用方式的情况下,为被装饰对象添加新的功能

能够在不修改原函数代码的基础上,在执行前后进行定制操作,闭包函数的一种应用

场景:

# 闭包函数就是内部的函数调用外部函数的变量,常用于装饰器。定义在函数内部引用了外部函数名称空间中的名字的函数。执行过程中获取到相应的数据,避免了外部干扰。

# 判断闭包函数的方法:__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循环):

原文地址:https://www.cnblogs.com/heruxiu/p/13495505.html