IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python中的闭包函数&装饰器 -> 正文阅读

[Python知识库]python中的闭包函数&装饰器

本文为在霍格沃兹测试开发学社中学习到的一些技术(或者:本文为在霍格沃兹测试开发学社的学习经历分享),写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~

当我们在python中定义一个函数中,我们可能需要这个函数执行的一些其他属性等等,如下面的例子:

当我们在执行一个函数时,打印这个函数运行时总共运行了多长的时间

首先定义该函数:

def hog(name):

????print(f'这个是被包裹的函数{name}')

????time.sleep(1)

其次打印这个函数的执行总共需要运行的时间是多少

start_time = datetime.now()

print(f'函数执行前的时间是{start_time}')

hog('hog')

end_time = datetime.now()

print(f'函数执行后的时间是{end_time}')

print(f'f函数执行总共用的时间是{end_time-start_time}')

如果我们再还一个其他的函数,去计算它执行的时间有多少,需要将上面的代码再重复的编写,通过再次封装一个函数,我们将这个功能去实现出来

在这里,变化的是这个函数,那么我们将这个函数作为一个参数去传入另外一个实现该功能的函数,并在此函数中去定义我们需要计算执行时间的函数


def cal_time(func,name):

????start_time = datetime.now()

????print(f'函数开始执行的时间是:{start_time}')


????func(name)


????end_time = datetime.now()

????print(f'函数结束执行的时间是:{end_time}')

????print(f'函数运行结束使用的时间是:{end_time-start_time}')



#调用这个函数

cal_time(hog,'hog')

上述代码中我们将实现打印函数执行的时间功能封装成了一个函数,这样其他的函数有计算执行时间的需求时,我们即将这个函数的引用传入即可

但同时又引入其他的一些问题:

????????1.我们在调用函数的时候,调用方式是cal_time(hog,'hog'),代码的可读性比较差,我们在阅读代码时,有时候会不清晰为什么要调用外部的这个函数,容易搞混淆

????????2.外函数的实现封装的功能可读性也不够明确

????????3,每个函数可能会有不同的参数

那么基于以上的问题,我们有了以下的解决方式

在上述的代码方式中,我们在外函数里面又定义了一个内函数,在内函数中实现功能,并且调用需要执行的函数,并将这个内函数的引用返回;且内函数可以传入多种参数,解决了上述的第2个和第3个问题


def close(func):

????def inner(*args,**kwargs):

????????start_time = datetime.now()

????????print(f'函数执行前的时间是{start_time}')

????????func(*args,**kwargs)

????????end_time = datetime.now()

????????print(f'函数执行后的时间是{end_time}')

????????print(f'f函数执行总共用的时间是{end_time-start_time}')

????return inner



close(hog)('hog')

首先我们来了解下闭包函数的定义:

一个函数的返回值是另外一个函数,返回的函数调用父函数内部的变量,如果返回的函数在外部被执行,就产生了闭包函数。

我们定义的上述函数其实就是闭包函数,我们在close函数中定义了一个内函数,并且该外函数的返回值是一个该内函数,而我们在执行close(hog)('hog')时,实际上也是执行内函数,于是上述就是一个闭包函数

下面就引入了我们的装饰器,而我们装饰器本质上就是一个闭包函数,只是编写的格式不同

def close(func):

????def inner(*args,**kwargs):

????????start_time = datetime.now()

????????print(f'函数执行前的时间是{start_time}')

????????func(*args,**kwargs)

????????end_time = datetime.now()

????????print(f'函数执行后的时间是{end_time}')

????????print(f'f函数执行总共用的时间是{end_time-start_time}')

????return inner


@close

def hog(name):

????print(f'这个是被包裹的函数{name}')

????time.sleep(1)


hog('hog')

我们在使用装饰器之后,仅使用hog('hog')即可,就可以实现上述函数的调用。

问题又来了,为什么在被包裹的函数定义前加@close,就可以直接去调用被包裹的函数呢,我们看看调试的信息

当我们直接使用hog('hog')如下图,可以看到,hog函数的引用被赋值外函数中内函数的引用,那么hog(‘hog’),就相当于是内函数的调用,因此我们直接使用hog('hog')就等价于close(hog)('hog')

如此,我们的装饰器就完成啦!

推荐阅读文章链接:接口测试经典面试题:Session、cookie、token有什么区别?_霍格沃兹测试开发学社的博客-CSDN博客

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:24:53  更:2022-11-05 00:28:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:20:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码