• 【Python】装饰器_详解


    装饰器:

         定义:本质是函数(装饰其他函数),意思就是为其他函数添加附加功能。

        原则:1.不能修改被装饰函数的源代码

              2.不能修改被装饰函数的调用方式

        实现装饰器,要具备的知识:

           1.函数即变量

              2.高阶函数(满足下面一个条件就是高阶函数  )    

              a:把一个函数名当做实参传递给另外一个函数

              b:返回值中包含函数名 (不修改函数的调用方式)                

              3.嵌套函数

                  高阶函数+嵌套函数==》装饰器

    小虾这就来举一个比较常见的例子:

    def  decorator (func):
        def inner():
            # 验证1
            # 验证2
            # 验证3
            return func()
        return inner
     
    @decorator  =》f1=decorator(f1)
    def f1():
        print ('f1')

    注意:@函数名 是python的一种语法糖。   

    如上例@decorator,内部会执行一下操作:执行decorator 函数,并将 @decorator 下面的 函数 作为decorator函数的参数,即:@decorator 等价于 decorator(f1)所以,内部就会去执行:

    def inner:
            #验证
            return f1()   # func是参数,此时 func 等于 f1
        return inner     # 返回的 inner,inner代表的是函数,非执行函数

    # 其实就是将原来的 f1 函数塞进另外一个函数中

    将执行完的 decorator 函数返回值

    赋值

    给@

    decorator

    下面的函数的函数名

    decorator函数的返回值是:

    def inner:
       #验证
        return 原来f1()  # 此处的 f1 表示原来的f1函数
    然后,将此返回值再重新赋值给 f1,即:新f1 = def inner:
                            #验证
                            return 原来f1() 

    所以,以后想要执行 f1 函数时,就会执行 新f1 函数,在 新f1 函数内部先执行验证,再执行原来的f1函数,然后将 原来f1 函数的返回值 。

     上面提到的装饰函数没有参数:那么问题来了,如果其含有参数呢?又该如何呢?

    def w1(func):
        def inner(*args,**kwargs):
            # 验证1
            # 验证2
            # 验证3
            return func(*args,**kwargs)
        return inner
     
    @w1
    def f1():
        print("f1")
    def f2(arg1,arg2,arg3):
        print ("f2")

    上面代码中通过在装饰器中的参数中使用(*args,**kwarge)(*args是非关键字参数,用于元组,**kw是关键字参数,用于字典),就可以装饰具有处理n个参数的函数的装饰器。(如果有什么不太明白的,可以查看这篇博客  https://blog.csdn.net/qq_33432841/article/details/107768100 

    我们什么都没有,唯一的本钱就是青春。梦想让我与众不同,奋斗让我改变命运!
  • 相关阅读:
    指示函数
    Sql Server中的日期与时间函数
    http://www.jb51.net/softjc/33896.html(vs2010破解)
    什么是VC维?
    smalldatetime和datetime的差别
    基于大规模语料的新词发现算法
    向setInterval , setTimeout调用的函数传递参数
    取指定月份的天数
    SQL 写循环数据
    JavaScript事件一瞥
  • 原文地址:https://www.cnblogs.com/mengmengxia/p/13427365.html
Copyright © 2020-2023  润新知