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

    一切皆对象:

    首先我们来理解下Python中的函数

    def hi(a='qing'):

      return 'la'+a

    print(hi())===========结果为:"la qing"

    我们也可以把这个函数赋值给一个变量

    bb=hi

    注意:复制的时候没有使用小括号,因为我们并没有调用hi函数

    只是把它放在bb变量里,(其实也就是bb和hi同时引用这个函数)

    print(bb())===========结果为:"la qing"

    del hi

    print(hi())============结果会报错

    print(bb())===========结果为:"la qing"

    在函数中定义函数:

    def hehe():

      print('现在在hehe函数中')

      def ha():

        print("做一个好学生")

      def yi():
        print("好好学习")

      ha()

      yi()

      print("hehe函数结束")

    hehe()

    输出结果为:

    '现在在hehe函数中'

    "做一个好学生"

    "好好学习"

    "hehe函数结束"

    注意:ha()和yi()函数不能在外面调用,只能在hehe()函数里面调用。

    从函数中返回函数

    注意:我们在函数中返回的是greet和welcome,而不是greet()和welcome(),因为当你把一对小括号放在后面,这个函数就会执行,然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。

    将函数作为参数传给另一个函数

    下面写一个装饰器:

    上面这种写法是比较容易理解的方式,下面通过@来实现

    这个两个方法实现的功能是一样的,第一种只是对于装饰器理解的一个过度,工作中还是用@这种,简单明了就可以知道是一个装饰器

    但是,当我们打印被装饰的函数名字时发现,函数名字已经改变,针对这种情况我们要把装饰器的函数部分做一些调整

    @wraps接受一个函数来进行装饰,并加入了复制函数名称,注释文档,参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。

     那么带参数的装饰器怎么写?

    带参数的装饰器指的是被装饰的函数需要传参

    分析如下:

    既然被装饰的函数需要传参,那么在它执行的时候肯定要传参的,所以装饰器里面a_func(a,b)肯定要把参数写在里面了(因为此时函数已经执行)

    那么最里面这个a_func函数,又是在外面一层的函数wrapTheFunction执行后才能执行,所以参数在wrapTheFunction函数里就要传进来(总结来说就是一层套一层)

    从最里面的函数找出处,然后把最顶端里面加上参数,那么为什么不在最外层a_new_decorator(a_func)这里面加参数呢,因为这里面接收的是被装饰的函数

    下面是代码:

    如果传的参数是不定长参数,就把a,b换成*args,**kwargs

  • 相关阅读:
    vue-路由传参
    ES6模板字符串
    es6中Set和Map数据结构
    本周面试题
    var、let和const定义变量的特点
    修改this的指向
    Echarts图表插件
    ES6学习
    swiper插件学习
    每日刷题4
  • 原文地址:https://www.cnblogs.com/daqingzi/p/9553217.html
Copyright © 2011-2022 走看看