探索Python装饰器:优雅地增强函数功能

Python 装饰器是一种高级功能,允许你在不修改原始函数代码的情况下,动态地修改或扩展函数的行为。

基本语法

装饰器是一种特殊的函数,其基本语法如下:

def decorator_function(func):def wrapper(*args, **kwargs):# 在调用原始函数之前的操作result = func(*args, **kwargs)# 在调用原始函数之后的操作return resultreturn wrapper

常用命令

  • @decorator_function:将装饰器应用到函数上的语法糖。
  • decorator_function:装饰器函数本身。

示例

示例 1:简单装饰器
def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
示例 2:带参数的装饰器
def repeat(num_times):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(num_times):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator_repeat@repeat(num_times=3)
def greet(name):print(f"Hello {name}")greet("Alice")

应用场景

1. 日志记录

装饰器在日志记录中发挥着重要作用,它可以捕获函数的输入参数、执行时间以及输出结果,从而方便开发人员跟踪函数的执行过程和调试代码。通过装饰器记录日志,可以提高代码的可读性和可维护性。

示例代码

import logging
import timedef log_decorator(func):def wrapper(*args, **kwargs):logging.info(f"Calling function {func.__name__} with args: {args}, kwargs: {kwargs}")start_time = time.time()result = func(*args, **kwargs)end_time = time.time()logging.info(f"Function {func.__name__} executed in {end_time - start_time} seconds with result: {result}")return resultreturn wrapper@log_decorator
def add(x, y):return x + yresult = add(3, 5)
print("Result:", result)
2. 性能监控

装饰器在性能监控方面也具有重要作用,它可以帮助开发人员监控函数的执行时间,发现潜在的性能瓶颈并进行优化。通过装饰器进行性能监控,可以提高代码的效率和性能。

示例代码

import timedef performance_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} seconds")return resultreturn wrapper@performance_decorator
def calculate_factorial(n):factorial = 1for i in range(1, n + 1):factorial *= ireturn factorialresult = calculate_factorial(10)
print("Factorial:", result)
3. 权限验证

装饰器可以用于权限验证,例如检查用户是否具有执行特定操作的权限。这种方式使得权限验证逻辑与业务逻辑分离,提高了代码的模块化和可维护性。

示例代码

def permission_required(permission):def decorator(func):def wrapper(*args, **kwargs):if check_permission(permission):return func(*args, **kwargs)else:raise PermissionError("Permission denied")return wrapperreturn decoratordef check_permission(permission):# 检查用户是否具有指定权限的逻辑return True  # 此处仅为示例,实际需根据业务逻辑实现@permission_required("admin")
def delete_user(user_id):# 删除用户的逻辑print(f"User {user_id} deleted successfully")delete_user(123)

注意事项

1. 装饰器顺序

当多个装饰器应用于同一个函数时,它们的执行顺序与它们在代码中的顺序相反。这意味着最先定义的装饰器实际上会最后执行,而最后定义的装饰器会最先执行。

示例代码

def decorator1(func):def wrapper():print("Decorator 1 executed")func()return wrapperdef decorator2(func):def wrapper():print("Decorator 2 executed")func()return wrapper@decorator1
@decorator2
def greet():print("Hello!")greet()

输出结果为:

Decorator 1 executed
Decorator 2 executed
Hello!
2. 装饰器的参数

如果装饰器本身需要接受参数,则需要在装饰器函数外再包裹一层函数。这样的装饰器称为带参数的装饰器。在定义带参数的装饰器时,外层函数接受装饰器参数,内层函数接受被装饰函数。

示例代码

def decorator_with_param(param):def decorator(func):def wrapper():print(f"Decorator with parameter {param} executed")func()return wrapperreturn decorator@decorator_with_param("test")
def greet():print("Hello!")greet()

输出结果为:

Decorator with parameter test executed
Hello!

总结

装饰器是 Python 中一种强大的工具,可用于动态修改函数的行为,常用于日志记录、性能监控、权限验证等场景。通过合理使用装饰器,可以提高代码的灵活性、可重用性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/23573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WP|9】深入解析WordPress [add_shortcode]函数

add_shortcode 是 WordPress 中一个非常强大的函数,用于创建自定义的短代码(shortcodes)。短代码是一种简洁的方式,允许用户在内容中插入动态的、可重用的功能。通过 add_shortcode,开发者可以定义自己的短代码&#x…

【MMU】——MMU 相关的 CP15 寄存器

文章目录 MMU 相关的 CP15 寄存器C1(System Control Register)C2(Translation Table Base Control Register)C3(Domain Access Control Register)C5(Data Fault Status Register)C6(Data Fault Address Register)C9C10MMU 相关的 CP15 寄存器 寄存器作用寄存器 C1 中…

前端开发环境:Vue、Element Plus、Axios

目录 1. Vue简介 2. Element Plus简介 3. Axios简介 4. 创建Vue项目 4.1 Node.js安装 4.2 创建Vue项目 4.3 Vue项目的结构 4.4 安装Element-Plus 4.5 安装Axios 4.6 解决跨域问题 5. 应用实例 5.1 创建Vue组件 5.2 配置路由 5.3 配置根组件 5.4 启动前端应用服…

Vue 爷孙组件通讯之:Provide / Inject 详细介绍

背景 在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,层层传递非常麻烦。 对于这种情况,我们可以使用一对 provide 和 inject。无论组件层次结构有多深…

在不受支持的 Mac 上安装 macOS Sonoma (OpenCore Legacy Patcher v1.5.0)

在不受支持的 Mac 上安装 macOS Sonoma (OpenCore Legacy Patcher v1.5.0) Install macOS on unsupported Macs 请访问原文链接:https://sysin.org/blog/install-macos-on-unsupported-mac/,查看最新版。原创作品,转载请保留出处。 作者主…

【leetcode--30.串联所有单词的子串】

有没有一样喜欢看示例的,,看题目就觉得很难懂。大致就是words要进行排列组合,返回s中所有包含这个排列组合的首标。 顺完逻辑蛮好懂的,应该不算困难题,只是不知道用什么模块实现。 class Solution:def findSubstring…

如何利用Varjo混合现实技术改变飞机维修训练方式

自2017年以来,总部位于休斯顿的HTX实验室一直在推进混合现实技术,与美国空军密切合作,通过其EMPACT平台提供可扩展的沉浸式飞机维护虚拟现实培训。 虚拟和混合现实对维修训练的好处: l 实践技能:提供一个非常接近真实场…

【C++题解】1074 - 小青蛙回来了

问题:1074 - 小青蛙回来了 类型:需要找规律的循环 题目描述: 关于小青蛙爬井的故事,你应该早就听过了:井深10 尺,小青蛙从井底向上爬,每个白天向上爬 3 尺,每个晚上又滑下来 2 尺&…

Java | Leetcode Java题解之第136题只出现一次的数字

题目: 题解: class Solution {public int singleNumber(int[] nums) {int single 0;for (int num : nums) {single ^ num;}return single;} }

App UI 风格,尽显魅力

精妙无比的App UI 风格

Eclipse添加C和C++编译成汇编文件的选项

在miscellaneous中添加assemble listing选项就可以生成汇编文件了

[自学记录09*]Unity Shader:在Unity里渲染一个黑洞

一、前言 记得很久很久以前,在ShaderToy上看过一个黑洞的效果,当时感觉太*8帅了,于是这几天就尝试自己弄了一个。 Gargantua With HDR Bloom (shadertoy.com) 下面是我自己实现的黑洞 可以看到还是略逊一筹(感觉略逊百筹&#x…

什么是容器技术

容器虚拟化技术是一种有效的将单个操作系统的资源划分到独立的组中的技术,以便更好地在独立的组之间平衡有冲突的资源使用需求。这种技术通过“伪造”操作系统的接口,将函数库层以上的功能置于操作系统上,从而实现应用程序级别的虚拟化。容…

07-指针的概念与引用,索引

指针的概念与引用,索引 一、内存地址 字节: 定义: 字节(byte)是内存容量的一个单位,一个字节包含8个位(bit)。 地址: 定义: 内存地址是系统为了方便区分…

Java 主键生成策略之雪花算法

概述 项目中为了缓解数据库服务器压力和提高并发量进行分库分表,在新增数据时,如果此时按照传统方式使用数据库主键自增,那么在并发下ID可能会冲突; 使用UUID的话又因其无序会产生页分裂导致磁盘IO过大使得系统性能降低; 经过了解雪花算法根据其特点可以解决分布式系统中生成…

DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)

场景 DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑: DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑_jenkins的安装以及集成jdkgitmaven 提示警告-CSDN博客 Windows10(家庭版…

AI学习指南机器学习篇-逻辑回归正则化技术

AI学习指南机器学习篇-逻辑回归正则化技术 在机器学习领域,逻辑回归是一种常见的分类算法,它常用于处理二分类问题。在实际的应用中,为了提高模型的泛化能力和降低过拟合风险,逻辑回归算法通常会使用正则化技术。本文将介绍逻辑回…

待定待定待定

BindingNavigator C# 属性&#xff08;Property&#xff09; get set StringBuilder https://www.bilibili.com/video/BV15u4y1F72C/ C# 高级数据结构有哪些 List - 动态数组&#xff0c;可以动态增长和缩减&#xff0c;提供快速访问、添加和删除元素的功能。Dictionary<TK…

c#vb代码互转工具

下载地址&#xff1a; https://download.csdn.net/download/wgxds/88979921

EN 17104-2021室内用热塑性硬质保护墙板CE认证

室内用热塑性硬质保护墙板是指由同材质或非均质塑料板制成的&#xff0c;表面有或者没有装饰层&#xff0c;用于墙体的保护作用而非起结构作用&#xff0c;通过胶粘剂粘贴安装。 EN 17104-2021室内用热塑性硬质保护墙板CE认证项目 认证项目 测试标准 防火 EN 13501-1 挥发…