函数进阶——装饰器

本文详细介绍了Python装饰器的概念、实现方式及其在实际编程中的应用。从基础的装饰器版本逐步进阶,探讨了如何处理参数、返回值以及装饰器的多层使用。通过实例展示了装饰器在统计函数执行时间和实现认证功能等方面的有效性,同时讲解了Python的装饰器语法糖,使代码更加简洁。最后,介绍了如何创建有参装饰器,以满足更灵活的需求。
摘要由CSDN通过智能技术生成

装饰器

​ 装饰器,见名知意,“装饰”表示为被装饰对象添加新的功能,“器”则表示是一个工具,它不是一个新的知识,而是“函数嵌套+闭包+函数对象“等内容进行组合使用的产物,目的是为了在不改变原有函数代码内容和调用方式的基础上,新增额外的功能。例如认证功能,在很多地方都需要使用,有了装饰器,就可以节省很多代码,使其在很多地方能够重复使用。

装饰器的核心思想:

  • 不改变原有函数的代码;
  • 不改变原函数的调用方式;
  • 在满足以上两个条件下,增加额外的功能。
引例:给index函数统计执行时间
储备知识:
	time模块
    时间戳:表示执行的这一刻距离1970年一月一日的总秒数
    time.time()
    原地等待:
    time.sleep(3)  # 表示等待三秒

    
import time 

def index():
    time.sleep(3)
    print('from index')

# 1. 在函数执行之前打印一个时间节点
start_time = time.time()
index()

# 2. 等待函数执行完毕之后,在打印一个时间节点
end_time = time.time()

# 3. 总的执行时间就是两个的差值
print(end_time - start_time)
装饰器的简易版本

​ 在上面引例中,虽然实现了统计index函数执行时间的功能,但是如果需要统计别的函数的执行时间时,就需要重复写同样的代码,这样很不方便,因此我们通过装饰器来实现此功能。

代码实现:

import time

def index():
    time.sleep(2)
    print('from index')
    
def outer():
    func = index
    def get_time():
        # 1. 统计一下函数执行前的时间戳
        start_time = time.time()
        func()
        # 2. 统计一下函数执行完之后的时间戳
        end_time = time.time()
        # 3. 计算差值
        print('函数执行时间:%s' % (end_time - start_time))
    return get_time

index = outer()
index()

​ 以上代码通过装饰器的方式实现了统计函数index的执行时间,但是被统计的函数已经固定了,为了让它通用,变成“器”,我们采用传参的方式将被装饰的函数传入,因此有了下面的结果:

import time

def index():
    time.sleep(2)
    print('from index')

def home():
    time.sleep(3)
    print('from home')

def outer(func):
    def get_time():
        # 1. 统计一下函数执行前的时间戳
        start_time = time.time()
        func()
        # 2. 统计一下函数执行完之后的时间戳
        end_time = time.time()
        # 3. 计算差值
        print('函数执行时间:%s' % (end_time - start_time))
    return get_time


index = outer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值