Python装饰器

news/2024/11/8 15:13:17/

目录

官方定义

函数装饰器的使用

实现一个最简单的装饰器

多装饰器嵌套

带参数的装饰器

装饰器内获取被修改函数的属性

类装饰器的使用

参考资料


官方定义

        装饰器本质上是一个Python函数,它可以让被装饰函数或方法在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器一般采用语法糖的形式,是一种语法格式。比如:@property,@wraps()。

函数装饰器的使用

实现一个最简单的装饰器

        使用装饰器可以将一些通用的功能从函数中抽离出来。

        给出一个示例函数

import timedef log():print('start!')time.sleep(5)print('log')print('end!')log()------------------
start!
log
end!

        使用装饰器的写法

import timedef sleep(func):def inner():print('start!')time.sleep(5)func()print('end!')return inner@sleep
# 相当于sleep(log())
def log():print('log')log()------------------
start!
log
end!

多装饰器嵌套

        多个装饰器时是依次嵌套执行的

import timedef sleep1(func):def inner():print('start!sleep1')time.sleep(5)func()print('end!sleep1')return innerdef sleep2(func):def inner():print('start!sleep2')time.sleep(5)func()print('end!sleep2')return inner@sleep1
@sleep2
# 相当于sleep1(sleep2(log()))
def log():print('log')log()------------------
start!sleep1
start!sleep2
log
end!sleep2
end!sleep1

带参数的装饰器

        由于装饰器只能接收一个参数,并且还是函数类型。所以如果想向装饰器传递其他参数,正确的写法应该是在装饰器外面再包裹上一个函数,让最外面的函数接收参数,返回的是装饰器,因为@符号后面必须是装饰器实例。

import timedef setTime(second):def sleep(func):def inner():print('start!'second)time.sleep(second)func()print('end!'second)return innerreturn sleep@setTime(5)
def log():print('log')log()------------------
start!5
log
end!5

装饰器内获取被修改函数的属性

        函数传入装饰器后会失去它原先的属性,比如参数。这时就需要用到@wraps装饰器了。

import time
from functools import wrapsdef setTime(second):def sleep(func):@wraps(func)def inner(*args, **kwargs):print('start!', func.__module__, func.__name__, second)time.sleep(second)func(*args, **kwargs)print('end!', func.__module__, func.__name__, second)return innerreturn sleep@setTime(5)
def log(msg):print(msg)log('log')------------------
start! __main__ log 5
log
end! __main__ log 5

类装饰器的使用

        类装饰器这个写法,主要思路就是返回一个增加了新功能的函数对象,只不过这个函数对象是一个类的实例对象。由于装饰器是可调用对象,所以必须在类里面实现__call__方法,这样由类生成的各种实例加上()就可以运行了。因为与函数装饰器是类似的,所以这里只展示一个最复杂的用法,装饰器带参数,且被装饰函数也带参数。

import time
from functools import wrapsclass Decorator:def __init__(self, second):self.second = seconddef __call__(self, func,*args, **kwargs):@wraps(func)def inner(*args, **kwargs):print('start!', func.__module__, func.__name__, self.second)time.sleep(self.second)func(*args, **kwargs)print('end!', func.__module__, func.__name__, self.second)return inner@Decorator(5)
def log(msg):print(msg)log('log')------------------
start! __main__ log 5
log
end! __main__ log 5

参考资料

python中带有参数的装饰器_python 带参数的装饰器_IT之一小佬的博客-CSDN博客

 python装饰器——获取被修饰的函数参数_python 装饰器获取被装饰函数属性_松子吃松子的博客-CSDN博客

python装饰器——获取被修饰的函数参数_python 装饰器获取被装饰函数属性_松子吃松子的博客-CSDN博客

python类装饰器详解-Python 类装饰器解析 (taodudu.cc)


http://www.ppmy.cn/news/67921.html

相关文章

table标签-移动端适配

封装一个组件,该组件需要根据不同设备屏幕宽度自适应调整展示方式。对于 PC 端,以类似 el-table 的形式展示数据,而移动端则以一个类似 item 的形式展示每行数据。 可以先在组件中判断设备类型,如以下示例代码所示: …

MySQL视图与联集

一、VIEW(视图) 1、 概念 可以被当作是虚拟表或存储查询 视图跟表格的不同是,表格中有实际储存资料,而视图是建立在表格之上的一个架构,它本身并不实际储存资料。 临时表在用户退出或同数据库的连接断开后就自动消…

QT是什么软件

QT是一款跨平台的C图形用户界面(GUI)应用程序开发框架,由Digia公司开发并维护。QT提供了一套易于使用的API,使得开发者可以轻松地开发出高质量的应用程序,这些应用程序可以运行在各种操作系统和设备上,包括Windows、Mac OS X、Lin…

web集群第一次作业

目录 一. 简述静态网页和动态网页的区别 二. 简述 Web1.0 和 Web2.0 的区别 三. 安装tomcat8,配置服务启动脚本,部署jpress应用。 一. 简述静态网页和动态网页的区别 1. 首先,两者的页面资源特征不同: 静态网页处理文件类型有…

低代码平台:10分钟从入门到原理

导航目录 一、低代码概念 二、优势及局限 三、基础功能及搭建 1、业务流程 2、用户权限 3、统计图表 四、使用感受 五、总结 传统的软件研发方式目前并不能很好地满足企业的需求:人员成本高、研发时间长、运维复杂。这时低代码工具的出现为快速开发软件提供…

图片转为base64格式的优缺点分析

1. 优点 (1)网页中使用base64格式的图片时,不用再请求服务器调用图片资源,减少了服务器访问次数。 (2)base64编码的字符串,更适合不同平台、不同语言的传输; (3&#…

多语言多方式API接口pinduoduo.item_search据关键词取商品列表

Curl PHP PHPsdk JAVA C# Python Golang javascript JS-SDK Ruby Swift Objective-C C C Node.JS Kotlin Rust R MATLAB 在PHP、JAVA和C#环境下,API接口调用都可以使用对应语言的网络通信库实现。以下是各个语言常用的网络通信库: 1.PHP&…

【存储数据恢复】H3C存储卷中的数据恢复案例

存储数据恢复环境&故障: H3C FlexStorage某型号存储,25块磁盘组建的RAID5,其中包含一块热备盘。 工作人员误操作将存储设备中原先的2个卷删除,删除之后又使用和删除2个卷同样大小的空间重建了一个卷。用户希望恢复删除的2个卷…