成为Python砖家(4): 装饰器的简单理解

2024-08-20 22:12

本文主要是介绍成为Python砖家(4): 装饰器的简单理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一次理解

Python 中的装饰器(decorator),是Python中一个非常强大的工具,它是一个返回函数的函数。

上面这个定义很简洁,但是没说清楚。

第二次理解

装饰器,是一个接收函数 func、返回封装后的函数 wrapper 的函数。(没懂)

第三次理解

装饰器,是一个接收函数 func、定义一个 wrapper 函数来调用 func、并且执行其他的语句(用户自行定制),然后返回这个 wrapper 函数。(还是没懂)

第四次理解

装饰器,包括定义装饰器函数,以及使用装饰器函数两部分:

  • 定义装饰器函数时,是传入普通函数 func、 定义一个调用 func 以及其他定制化内容的函数 wrapper、并把函数 wrapper 作为返回值。
  • 使用装饰器函数时,是用 @decorator_name 的形式放到普通函数func定义的上面一行,使得原本定义的函数 func, 会被 Python 解释器解释为 func = decorator_name(func)。也就是说那个纯粹的函数被“吞掉了”,用户得到的函数是那个 wrapper, 只不过 wrapper 通常会调用原本定义的函数 func。
    嗯,还是很抽象,来看具体的例子:
import timedef timer_decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs) # 调用原始函数end_time = time.time()print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds")return resultreturn wrapper# 使用装饰器, 相当于 example_function = timer_decorator(example_function)
@timer_decorator
def example_function(x):time.sleep(x)  # 模拟一个花费一定时间的操作return x * 2def hello(x):time.sleep(x)return x * 2
hello = timer_decorator(hello)# 调用函数
result = example_function(2)
print(f"Result: {result}")result = hello(2)
print(f"Result: {result}")

其中

@timer_decorator
def example_function(x):...

相当于

def example_function(x):...example_function = timer_decorator(example_function)

上面提到的 timer_decorator是自定义的装饰器。 Python 也自带了一些装饰器,如 staticmethodclassmethod

staticmethod 装饰器

staticmethod 装饰器是 Python 自带的。把一个方法转换为静态方法。

直白理解:

class C:@staticmethoddef f(arg1, arg2, argN):...# 相当于
def f():...class C:f = staticmethod(f)

再更具体的例子:如下的C和D类,仅仅是名字差异,功能一样

def hello(name):print(f"hello, {name}")class C:f = staticmethod(hello)class D:@staticmethoddef f(name):print(f"hello, {name}")C.f("world")
D.f("python")

在这里插入图片描述

classmethod 装饰器

classmethod: 把一个方法封装成类方法。 相比于 staticmethod 装饰器, classmethod多了第一个参数 cls(或 self), 用于访问和修改类变量。

References

file:///Users/zz/Documents/pydoc-zh-cn/python-3.12.5-docs-html/library/functions.html#staticmethod

这篇关于成为Python砖家(4): 装饰器的简单理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091319

相关文章

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使