• 装饰器的学习 初级版-- 高阶函数,嵌套函数,闭包


    装饰器: 本质是函数, 功能是为其他函数添加附加功能
    原则:
    1 不修改被修饰函数的源代码
    2 不修改被修饰函数的调用方式

    为了实现装饰器的功能,需要了解3个概念
    1。高阶函数
    高阶函数定义
    函数接收的参数是一个函数名
    函数的返回值是一个函数名
    满足上述条件的任意一个,都称为高阶函数
    def foo():
        print('from the foo')
    
    def test(func):
        return func
    
    res = test(foo)
    res()

     函数test()就是高阶函数, 因为其输入的参数就是foo函数名, 返回的也是func指示的foo的函数名

     需要指出的是:

     res()实际上就是foo()

     我可以把 res = test(foo) ==> foo = test(foo)

     嵌套函数

     指的是在函数内在创建一个函数

    def father(name):
        #print('from father%s' %name)
        def son():
            #print('我的爸爸是%s'%name)
            def grandson():
                #name='就是我自己'
                print('my grandfather%s'%name)
            return grandson
        return son
    
    father('abc')()()#my grandfather abc

      运行一次函数返回内层嵌套函数的函数名在此运行(),又返回其内层的函数名再次运行(),把最内层的print出来

     函数嵌套的目的很简单:

        把参数传递给最里层的函数,并运行最里层函数  --实际上就是闭包的概念

     

    整个的装饰器的原理和实现已经完成了! 

    装饰器的功能实现由4个内容的实现

    1。运行被装饰的函数

    2。传递被装饰函数的参数

    3。返回被装饰函数的返回值

    4。 在语法糖上输入各种可以传入的参数,以实现功能的增强

    import time
    
    def timmer(func):
        def inner(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            stop_time = time.time()
            print('程序test运行时间%s' % (stop_time - start_time))
            return res
        return inner
    
    def test(name):
        time.sleep(1)
        print('%s test is over'%name)
        return True

    以上就是装饰器的简单程序。 目前需要执行程序,为了实现装饰的调用不变的要求

    test = timmer(test)
    test()

    需要分两步走,第一步获得inner函数的地址,赋值给test 然后运行test ,第二步运行test实际上是运行了inner函数, 在inner函数内的真实test的地址得到运行。

    从而实现功能

     把test =timmer (test ) ===> @ timmer来修饰test, 使得test () 更加真实还原!!!

    import time
    
    
    def timmer(func):
        def inner(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            stop_time = time.time()
            print('程序test运行时间%s' % (stop_time - start_time))
            return res
    
        return inner
    
    
    @timmer  # test = timmer(test)
    def test(name):
        time.sleep(1)
        print('%s test is over'%name)
        return True
    
    
    test('alex')

     运行结果:

    alex test is over
    程序test运行时间1.0000572204589844
  • 相关阅读:
    v-for
    class样式绑定
    数据单向绑定(v-bind:)和数据的双向绑定(v-model)
    v-on 事件修饰符
    C++中相对路径与绝对路径以及斜杠与反斜杠的区别(转)
    计算机图形学—判断点在直线上的方法(转)
    Eclipse XML/HTML语法高亮方法
    虚拟机 ubuntu 上网的配置过程
    VirtualBox虚拟机网络设置(四种方式)(转)
    查看Linux服务器网络状态(转)
  • 原文地址:https://www.cnblogs.com/vincent-sh/p/12937716.html
Copyright © 2020-2023  润新知