• Python装饰器


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

    实现装饰器知识储备
    1、函数即“变量”
    2、高阶函数
      定义:
      1)函数接收的参数是一个函数名
      2)函数的返回值是一个函数名
      3)满足上述条件的任意一个,都可称之为高阶函数
      总结
    1)把一个函数名当作实参传给另外一个函数
        作用:在不修改被装饰函数源代码的情况下为其添加功能
        不足:会改变函数的调用方式
    2)返回值中包含函数名
        作用:不修改函数的调用方式
        不足:不能添加新功能
    #一个最简单的高阶函数:
    
    def add(x, y, f):
        return f(x) + f(y)
    '''
    当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函#数定义,我们可以推导计算过程为:
    
    x = -5
    y = 6
    f = abs
    f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
    return 11
    用代码验证一下:
    '''
    def add(x, y, f):
        return f(x) + f(y)
    
    print(add(-5, 6, abs))
    一个最简单的高阶函数
    def foo():
        print('我的函数名作为参数传给高阶函数')
    def gao_jie1(func):
        print('我就是高阶函数1,我接收的参数名是%s' %func)
        func()
    
    def gao_jie2(func):
        print('我就是高阶函数2,我的返回值是%s' %func)
        return func
    
    gao_jie1(foo)
    gao_jie2(foo)
    高阶函数示范2
    #高阶函数应用1:把函数当做参数传给高阶函数
    import time
    def foo():
        print('from the foo')
    
    def timmer(func):
        start_time=time.time()
        func()
        stop_time=time.time()
        print('函数%s 运行时间是%s' %(func,stop_time-start_time))
    timmer(foo)
    #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
    把函数当做参数传给高阶函数
    #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
    import time
    def foo():
        print('from the foo')
    
    def timmer(func):
        start_time=time.time()
        return func
        stop_time=time.time()
        print('函数%s 运行时间是%s' %(func,stop_time-start_time))
    foo=timmer(foo)
    foo()
    #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
    把函数名当做参数传给高阶函数,高阶函数直接返回函数名
    3、嵌套函数

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

    #函数的调用和嵌套
    def foo():
        print('in the foo')
        bar() #此处只是函数的调用,如果有def定义,则是函数的嵌套
    
    def bar():
        print('in the bar')
    
    foo()
    
    
    #装饰器代码
    def timer(func):
        def deco():
            start_time = time.time()
            func()
            stop_time = time.time()
            print('the func run time is %s'%(stop_time-start_time))
        return deco
    @timer #等同于func1 = timer(func1)
    def func1():
        time.sleep(3)
        print('in the func1')
    @timer
    def func2():
        time.sleep(3)
        print('in the func2')
    
    # deco(func1)
    # deco(func2)
    
    #func1 = timer(func1)
    func1()
    func2()
     
  • 相关阅读:
    学习UML类图
    【转】监听器(Listener)学习
    【转】ContextLoaderListener和DispatcherServlet加载内容的区别
    个人B站+微信公众号
    如何直观形象地树状打印一棵二叉树?
    轻松手撕10大排序算法
    简单易懂的快速幂取模算法
    程序员必学:快速幂算法
    为什么Swift和Python要抛弃++--?
    JetBrains系列IDE的配色方案(IDEACLionPyCharm)
  • 原文地址:https://www.cnblogs.com/AkumaIII/p/8116301.html
Copyright © 2020-2023  润新知