必威体育Betway必威体育官网
当前位置:首页 > IT技术

Python中functiools.wraps()的功能以及用法详解

时间:2019-06-03 13:45:09来源:IT技术作者:seo实验室小编阅读:83次「手机版」
 

wraps

   今天学习Pyhton学到了装饰器,但是遇到视频无法播放,附带源码中有一个functools.wraps()的装饰器,看了好久做了实验才知道是干什么的

先看一下functool.wraps的定义以及阐述(由于我用的是虚拟机,所以只能上图片不能上代码了):

大概意思是说,这个函数返回一个装饰器,调用update_wrAPPer()函数,和装饰器一起作为wraps()的剩余的参数,默认参数是和update_wrapper()的相同,后面大概意思是这个是个简单的函数去应用partial()和update_wrapper().(英语不好,只能翻译出大概。见谅见谅。)

在functools的源文件代码中,有这样的说明:

大概意思是说:update_wrapper()和wraps()是帮助编写可以处理naive内省的包装器功能的工具。原谅我的英语不好,这里的naive翻译不出来,我只知道它的天真的意思。

而wraps的参数是这样定义的:

表明,这个函数(functool.wraps)只会对这几个属性起作用,而这些属性都是我们非常熟悉的,比如__doc__属性,我们可以用来查看帮助文档,从wraps的文档中,我猜测这个函数应该有partial()类似的功能。

我们知道,Python中partial()函数可以给某带参数的函数的参数绑定一个默认值,调用的时候就无须传递参数了,那么,这个函数(functool.wraps())是不是可以起到类似于绑定的作用,但是绑定的是源文件的私有属性。

当装饰器装饰一个函数时,实际上就是将被装饰的函数作为一个参数传入装饰器函数,返回一个闭包,而闭包内部调用这个函数,再另外多做一些事情。然后再由我们的函数名字去接收那个返回值的闭包的引用,达到了我们装饰的目的,所以此时,我们的函数的__name__等属性其实已经改变,变成了我们闭包的私有属性。

怀着试试看的态度,我写了以下代码,得出了如下的结果:

可见,这个函数确实是将被装饰函数的__name__以及__doc__等属性绑定到了原函数的上面。我把那个闭包的装饰器

@functools.wraps(func)

删除掉,出现这样的结果:

所以,我得出这样的总结:

functools.wraps()这个函数,作为一个装饰器去装饰闭包,并且给这个装饰器传入一个参数,这个参数是闭包外的装饰器装饰的那个外部的被装饰函数,此时,外部我们的自定义的函数的私有属性如__name__、__doc__等还是为我们自定义的函数本身的私有属性,而不会变成闭包的私有属性。

谢谢大家看完,小白理解浅陋,还望各位指出问题所在。

相关阅读

python之Django的入门08------事务管理、悲观锁、乐观

上一篇文章链接Django07我们接着上一篇文章的基础上,来继续了解进一步的Django框架一.事务管理在实际项目里,事务管理是一个很重要

python3爬虫爬取风之动漫漫画

最近迷上一拳超人,在xx动漫上看漫画时总是遇到各种网络问题,索性之间爬下来源码如下import requests, re from bs4 import Beautifu

Python实现求二阶行列式

目录 题目描述 输入/输出描述 解决思路 代码 代码走读 传送门 测试用例 1. 输入的数据都是整型 2. 输入的数据存在非法字符 题

Python product函数介绍

Python product函数介绍 ​ product(A,B)函数,返回A和B中的元素组成的笛卡尔积的元组,具体见如下代码:import itertools for item

异步编程 101:Python async await发展简史

本文参考了:How the heck does async/await work in Python 3.5? PEP 380: Syntax for Delegating to a Subgenerator yield 和 yi

分享到:

栏目导航

推荐阅读

热门阅读