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

    #装饰器:本质就是函数,功能是为其他函数添加附件功能,就是让函数执行前做什么,函数执行后做什么
    #原则:
    #1 不修改被修饰函数的源代码
    #2 不修改被修函数的的调用方式

    #装饰器知识储备:
    #装饰器=高阶函数+函数嵌套+闭包
    # 高阶函数满足下面条件之一就是高阶函数
    # 1 把函数当作参数传递给另外一个函数
    # 2 返回值值包含函数
    #装饰器搞起
    import time
    
    def wap(func):    #2 func是test函数的内存地址
        print(func)
        def inter():
            start = time.time()
            func()     #5 func是test函数的内存地址就是执行test函数
            end = time.time() - start
            print('test运行执行时间为',end)
        return inter #3 返回一个函数inter内存地址
    
    @wap
    def test():
        time.sleep(1)
        print('test执行完成')
    
    # res = wap(test)   #1 执行wap(test) 把test函数的内存地址传递给 func
    # res()             #4 rest 是wap 函数返回过来的inter内存地址加上括号就是执行inter函数
    #以上是修改了函数的的调用方式
    
    #不修改函数的的调用方式,但是在之前需要做一个赋值操作
    # test = wap(test)
    # test()
    
    #使用另外一个方式:
    #@wap 就相当于执行了test = wap(test)
    test()

     

    #加一个返回值的
    import time
    def wap(func):
        print(func)
        def inter():
            start = time.time()
            ret = func()  #运行的是test
            end = time.time() - start
            print('test运行执行时间为',end)
            return ret    #把运行test的返回值返回
        return inter
    
    @wap        #test = wap(test)
    def test():
        time.sleep(1)
        print('test执行完成')
        return 'test 返回值'
    
    res = test()  #运行的是inter
    print(res)    #结果是test 返回值;  1: 因为test()就是运行inter()函数;inter()函数会运行ret = func() ;也就是运行test()函数,这时候test函数有一个返回值返回给了ret ,2: inter函数运行到最后,也会返回ret给res

     

     
    import time

    def wap(func):
    print('wap',func) #func = <function sum at 0x031F3858>
    def inner():
    start = time.time()
    func()
    end = time.time() - start
    print(end)
    return inner #返回给sum

    @wap #sum = wap(sum)
    def sum():
    time.sleep(2)
    print('我执行了')
    print(sum) #接收 inner内存地址 <function wap.<locals>.inner at 0x012D3780>
    sum() #执行inner()

     执行结果:

      wap <function sum at 0x02B53858>

           <function wap.<locals>.inner at 0x02B53780>

      我执行了

           2.0003716945648193

     

    装饰器传参:

    def wap(func):
    def inner(*args,**kwargs):
    start = time.time()
    func(*args,**kwargs)
    print(args)
    end = time.time() - start
    print(end)
    return inner

    @wap
    def sum(name,age):
    time.sleep(2)
    print('我执行了')
    sum('tom',12)

    执行结果:

      我执行了
      ('tom', 12)
      2.0003695487976074

     

    装饰器上面传参数:

    import time
    def wanrun(leo='http'):
    def wap(func):
    def inner(*args,**kwargs):
    print(leo)
    start = time.time()
    func(*args,**kwargs)
    print(args)
    end = time.time() - start
    print(end)
    return inner
    return wap

    @wanrun('测试') #wanrun('测试')等于执行wanrun('测试')这个函数,开始触发函数wanrun执行 ---> wanrun执行就会返回wap函数;所有这个地方最终还是显示@wap ; sum = wap(wanrun)
    def sum(name,age):
    time.sleep(2)
    print('我执行了')
    #sum = wap(wanrun) #@wanrun 等于 sum = wap(wanrun) 返回inner
    sum('tom',12) ##运行的是inter

     

  • 相关阅读:
    一、初识数据库
    面向对象—基础、名称空间、三大特性
    六、内置函数
    五、迭代器、生成器、装饰器
    四、global和nonlocal、函数名应用、格式化输出
    三、名称空间
    二、函数的参数
    shell脚本
    线性代数
    [模块] python调用java代码-jpype
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9006603.html
Copyright © 2011-2022 走看看