zoukankan      html  css  js  c++  java
  • 装饰器

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

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

    场景:

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

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

  • 相关阅读:
    堆和栈的区别
    .net中类(class)与结构(struct)的不同
    CTS、CLS、CLR
    C#和.Net的关系
    装箱(boxing)和拆箱(unboxing)
    三层架构
    属性和public字段的区别(调用set方法为一个属性设值,然后用get方法读取出来的值一定是set进去的值吗?)
    override与重载(overload)的区别
    C#中的委托是什么?事件是不是一种委托?事件和委托的关系。
    json转树状菜单栏
  • 原文地址:https://www.cnblogs.com/heruxiu/p/13495505.html
Copyright © 2011-2022 走看看