Python中的装饰器使用
作者:子休_ 发布时间:2023-05-25 13:14:09
标签:Python,装饰器
Python装饰器用法
Python的装饰器是个好东西,它能干很多事情。
但对于新手,它看起来似乎没那么简单。
但事实上,装饰器本身也只是个函数。
import time
def log(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print("The func '{}' used {}s.".format(func.__name__, end-start))
return result
return warpper
这一个装饰器,当我们这样使用时
@log
def fucok(name):
"""Fucok someone"""
print("Fucok", name)
它只是执行了fucok = log(fucok)这样一句代码而已。
也就是说,我们表面上是用fucok("myself"),事实上执行的都是log(fucok)("myself")。因为Python里面都是对象嘛。
同样的道理,假设我们定义了一个带参数的装饰器logging,它实际上执行的是
func = logging(arguments)(func)
也就是上面那个不带参数的装饰器多定义一层就行了。
import time
def logging(arguments):
def log(func):
def warpper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print("The func '{}' used {}s.".format(func.__name__, end-start))
return result
return warpper
# do something
return log
但,当我们使用一个装饰器之后,它会将原本的函数元信息给覆盖掉。譬如:函数名称,函数文档等等。
例如上例
print(fucok.__name__)
print(fucok.__doc__)
你会发现,函数信息全部没了!fucok它不叫fucok,改名叫wrapper了。它的文档也变成了none。
解决办法很简单,定义装饰器的时候用warps装饰器装饰接受原函数参数的那一层就行了。
这个来自functools模块的装饰器能帮你复制函数的元信息到被绑定的函数身上。
修改装饰器如下(其实就加了一行代码hhh)
import time
from functools import wraps
def log(func):
@wraps(func)
def warpper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print("The func '{}' used {}s.".format(func.__name__, end-start))
return result
return warpper
当我们再运行
print(fucok.__name__)
print(fucok.__doc__)
就能看到函数的的元信息没变了。
装饰器定义时加@wraps是个好习惯。
一个较为实用的装饰器demo在该专题的另一篇文章:函数参数类型检查
来源:https://www.jianshu.com/p/4416e291c64d


猜你喜欢
- (1)服务器配置:[root@localhost ~]# cd /usr/local/src/[root@localhost src]# w
- Python 提供了两个级别访问的网络服务。:低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以
- 网上学习的时候总会遇到一些好的文章,分享给大家,也谢谢作者的分享。Python 简介Python 是一个高层次的结合了解释性、编译性、互动性
- 一、简单配置,获取单个网页上的内容。(1)创建scrapy项目scrapy startproject getblog(2)编辑
- 本文实例讲述了python服务器与android客户端socket通信的方法。分享给大家供大家参考。具体实现方法如下:首先,服务器端使用py
- 没办法,只能自己研究,经过大概一天时间吧,还是搞好了,写个总结。出现这种问题,解决方法大概有这几种:1.权限不够,导致弹出空吧提示框。(直接
- 我就废话不多说了,直接上代码吧!import paramikoimport pymysqlimport timelinux = ['
- 最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下:1、scatter函数原型2、其
- 当然还是要使用FileSystemObject(FSO)来创建了。不过在创建前,要先检查以下目录是否存在,如果存在,就不用创建了: 
- 首先下载selenium模块,pip install selenium,下载一个浏览器驱动程序(我这里使用谷歌)。#导入#注意python各
- 人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果
- 最近工作上有个需求,当爬虫程序遇到异常的时候,需要通知相应的人员进行修复。如果是国外可能是通过邮件的方式来通知,但国内除了万年不变的 qq
- 本文实例讲述了Python封装shell命令的方法。分享给大家供大家参考。具体实现方法如下:# -*- coding: utf-8 -*-i
- 一、react-reduxreact-redux依赖于redux工作。 运行安装命令:npm i react-redux:使用: 将Prov
- 本文实例为大家分享了python放大图片和画方格的具体代码,供大家参考,具体内容如下1、Python 放大图片和画方格算法#!C:/Pyth
- 又遇到了一个坑。。类似于安装py2neo时遇到的问题差不多...今天准备试一下docx,按照网上的步骤直接在命令行中pip install
- 其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个
- 本文介绍了SpringBoot 中使用JSP的方法示例,分享给大家,具体如下:依赖: <parent>
- 前言Python的异常处理能力非常强大,但是用不好也会带来负面的影响。我平时写程序的过程中也喜欢使用异常,虽然采取防御性的方式编码会更好,但
- 在 多线程与多进程的比较 这一篇中记录了多进程编程的一种方式.下面记录一下多进程编程的别一种方式,即使用multiprocessing编程i