当前位置: 首页 > news >正文

Python 装饰器:函数的函数,代码的艺术

引言

在Python中,装饰器是一种强大的功能,允许程序员在不修改原函数源码的情况下增强或修改函数行为。装饰器本质上是一个接收函数作为参数的高阶函数,并返回一个新的函数或修改原函数的行为。这种机制极大地提高了代码的复用性、可读性和模块化程度。

装饰器基础

装饰器的基本语法如下:

def decorator_function(original_function):def wrapper(*args, **kwargs):# 执行一些前置操作print("Before calling the original function.")# 调用原函数result = original_function(*args, **kwargs)# 执行一些后置操作print("After calling the original function.")# 返回原函数的结果return resultreturn wrapper
使用装饰器

要在函数上应用装饰器,只需在函数定义前加上 @decorator_name 即可:

@decorator_function
def target_function(arg1, arg2):print(f"Inside target function with args: {arg1}, {arg2}")

这相当于:

def target_function(arg1, arg2):print(f"Inside target_function with args: {arg1}, {arg2}")target_function = decorator_function(target_function)
带参数的装饰器

装饰器不仅可以作用于函数,还可以带有参数,这使得装饰器本身具有更多的灵活性。下面是一个带参数的装饰器示例,它使函数重复执行指定次数:

def repeat(n):def decorator(func):def wrapper(*args, **kwargs):for _ in range(n):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(3)
def greet(name):print(f"Hello, {name}!")greet("Alice")  # 输出 Hello, Alice! 三次
类装饰器

类装饰器是一个包含 __call__ 方法的类。当装饰器被应用时,__call__ 方法被调用,它接收原函数作为参数,并返回新的函数。

class DecoratorClass:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print("Before calling the original function.")result = self.func(*args, **kwargs)print("After calling the original function.")return result@DecoratorClass
def my_function():print("Inside my_function.")my_function()  # 输出 Before, Inside, After
装饰器应用场景

装饰器在Python中有着广泛的应用,包括但不限于:

  • 日志记录:记录函数的调用信息、参数和返回值。
  • 性能分析:测量函数的执行时间。
  • 权限控制:限制对某些函数的访问权限。
  • 缓存:存储函数结果以提高性能。
  • 事务管理:在数据库操作前后进行资源锁定和释放。
总结

装饰器是Python语言的特色之一,它允许我们以一种简洁、优雅的方式扩展函数或类的功能。通过理解和运用装饰器,我们可以写出更加灵活、模块化的代码,提高开发效率,同时保持代码的清晰和可维护性。无论是对于初学者还是经验丰富的开发者,掌握装饰器的使用都将是一笔宝贵的财富。

http://www.lryc.cn/news/402877.html

相关文章:

  • 安全防御2
  • C语言 ——— 打印水仙花数
  • 「Conda」在Linux系统中安装Conda环境管理器
  • 9.11和9.9哪个大?GPT-4o也翻车了
  • [开源]语雀+Vercel:打造免费个人博客网站
  • 使用ElementUI和element-china-area-data库实现省市区三级联动组件封装
  • 0718,TCP协议,三次握手,四次挥手
  • 如何安装Visual Studio Code
  • vi 编辑器快捷生成 main 函数和基本框架
  • npm相关指令
  • 为什么不要碰自媒体
  • 酷炫末世意境背景404单页HTML源码
  • PHP 调用 1688 详情 API 接口的实战攻略
  • SAP ABAP性能优化
  • 【鸿蒙学习笔记】构建布局・选项卡 (Tabs)
  • 独立游戏《星尘异变》UE5 C++程序开发日志5——实现物流系统
  • Web开发:<br>标签的作用
  • DVC+Minio
  • C++内存管理(区别C语言)深度对比
  • 手把手带你写一个精简版 HashMap 的 put 方法
  • 【面试题】数据结构:堆排序的排序思想?
  • PyTorch 深度学习实践-循环神经网络基础篇
  • vue实现可拖拽dialog封装
  • 本地多模态看图说话-llava
  • 人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解
  • Java异常抛出与处理方法
  • 兼容性测试主要有什么类型?
  • 设计模式--组合模式
  • ArduPilot开源代码之AP_DAL_RangeFinder
  • SpringCloud教程 | 第九篇: 使用API Gateway