zoukankan      html  css  js  c++  java
  • 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()
     
  • 相关阅读:
    vulcanjs 包类型
    vulcanjs schemas&& collections
    vulcanjs 核心架构概念
    vulcanjs 开源工具方便快速开发react graphql meteor 应用
    ory Oathkeeper Ecosystem
    ory Oathkeeper docker-compose 安装运行
    benthos stream nats 集成试用
    benthos 几个方便的帮助命令
    benthos 通过配置文件配置 stream 说明
    benthos 通过rest api 配置 stream 说明
  • 原文地址:https://www.cnblogs.com/AkumaIII/p/8116301.html
Copyright © 2011-2022 走看看