zoukankan      html  css  js  c++  java
  • python学习笔记(4)装饰器

    # 
    # 所谓装饰器就是在不改变原来函数的调用方式的情况下,给函数添加新功能。
    # 例如我们有求和函数如下:
    def summ(x = 0, y = 0):
        sum1 = x + y
        time.sleep(0.1)
        return sum1
    # 此时我们需要给该函数添加一个新功能,计算函数执行所花费的时间,由于该函数已经被其他模块调用,所以函数名不能改
    # 同时,其他函数在调用summ(x, y)时,需要有计算函数执行时间的功能。
    # 于是利用高阶函数的思维,将summ(x, y)函数作为一个参数传入另外一个函数,如下:
    def timer(summ):
        time1 = time.time()
        summ()
        time2 = time.time()
        print('执行时间为:', time2 - time1)
    
    timer(summ)
    '''
    执行结果:
    执行时间为: 0.10826659202575684
    '''
    # 这样虽然实现了功能,但是需要修改所有调用改函数的模块,将summ()修改问timer(summ),这样不满足封闭原则
    # 所以这里我们需要将在不改变函数的调用方式的情况下,完成新功能的添加,于是调整如下:
    def timer(func):
        def inner():
            time1 = time.time()
            func()
            time2 = time.time()
            print('执行时间为:', time2 - time1)
        return inner
    print('*'*100)
    summ = timer(summ)
    summ()
    '''
    执行结果:
    ****************************************************************************************************
    执行时间为: 0.10765576362609863
    '''
    # 这样我们既实现了新功能,又能保证调用方式不变,接下来需要解决传参和返回值的问题
    # 先看返回值,summ函数是计算两个值的和,需要返回两值的和,所以需要将和返回,如下:
    def summ(x = 0, y = 0):
        sum1 = x + y
        time.sleep(0.1)
        return sum1
    
    def timer(func):
        def inner():
            time1 = time.time()
            ret = func()
            time2 = time.time()
            print('执行时间为:', time2 - time1)
            return ret
        return inner
    print('*'*100)
    summ = timer(summ)
    sum1 = summ()
    print(sum1)
    '''
    执行结果为:
    ****************************************************************************************************
    执行时间为: 0.10943269729614258
    0----这就是返回值
    '''
    # 接下来需要解决传参的问题,我们的summ函数需要提供两个参数,但是由于我们这个装饰函数可能装饰不同的函数,不同的函数的参数个数可能不一致
    # 所以这里需要写成接收任意参数(*args, **kwargs),如下:
    def summ(x = 0, y = 0):
        sum1 = x + y
        time.sleep(0.1)
        return sum1
    
    def timer(func):
        def inner(*args, **kwargs):
            time1 = time.time()
            ret = func(*args, **kwargs)
            time2 = time.time()
            print('执行时间为:', time2 - time1)
            return ret
        return inner
    print('*'*100)
    summ = timer(summ)
    sum1 = summ(2, 5)
    print(sum1)
    '''
    执行结果:
    ****************************************************************************************************
    执行时间为: 0.10875892639160156
    7----这就是传参之后求和的结果
    '''
    # 这样这个装饰器就完成了,在python中有一种简单的方式来表示装饰器,就是用@加上装饰函数,写在被装饰函数的前面,如下:
    @timer
    def summ(x = 0, y = 0):
        sum1 = x + y
        time.sleep(0.1)
        return sum1
    print('*'*100)
    sum1 = summ(6, 5)
    print(sum1)
    '''
    执行结果:
    ****************************************************************************************************
    执行时间为: 0.10714888572692871
    11
    '''
    # 这样装饰器就讲完了。
  • 相关阅读:
    介绍Collection框架的结构;Collection 和 Collections的区别
    Mybites和hibernate的优缺点和区别2
    Mybites和hibernate的优缺点和区别
    AJAX如何获取从前台传递过来的数据然后在通过servle传递给后台
    list map set 集合的区别
    乐观锁和悲观锁的区别
    python生产消费Kafka
    python类型转换
    python实现远程方法调用
    Scala常用数据结构
  • 原文地址:https://www.cnblogs.com/tortoise512/p/14798994.html
Copyright © 2011-2022 走看看