首页 > 编程语言 >Python 装饰器:强大的代码增强工具

Python 装饰器:强大的代码增强工具

时间:2024-09-23 16:55:32浏览次数:3  
标签:__ return Python 代码 func time 装饰 def

在 Python 中,装饰器是一种非常强大的工具,它可以在不修改原有代码的情况下,为函数、方法或类添加额外的功能。本文将深入探讨 Python 装饰器的高级用法,展示其在不同场景下的灵活性和强大功能。

一、装饰器简介

装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数。这个新函数通常会在调用原始函数之前或之后执行一些额外的操作。装饰器的语法如下:

@decorator_function
def original_function():
    pass

在这个例子中,decorator_function是一个装饰器函数,它会在original_function被调用之前或之后执行一些操作。

二、简单装饰器示例

以下是一个简单的装饰器示例,它在函数被调用前后打印一些消息:

def my_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

在这个例子中,my_decorator是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapper。当say_hello函数被调用时,实际上是调用了wrapper函数,它会在调用原始函数say_hello之前和之后打印一些消息。

三、高级用法

  1. 带参数的装饰器

    • 装饰器也可以接受参数。这可以让你根据不同的参数来定制装饰器的行为。以下是一个带参数的装饰器示例:

         def repeat(n):
             def decorator(func):
                 def wrapper(*args, **kwargs):
                     for _ in range(n):
                         func(*args, **kwargs)
                 return wrapper
             return decorator
      
         @repeat(3)
         def greet():
             print("Hello!")
      
         greet()
      

      在这个例子中,repeat是一个装饰器工厂函数,它接受一个参数n,并返回一个装饰器函数。这个装饰器函数会将原始函数重复执行n次。

  2. 装饰器的堆叠

    • 多个装饰器可以堆叠在一起,依次应用于一个函数。以下是一个装饰器堆叠的示例:

         def decorator1(func):
             def wrapper():
                 print("Decorator 1 before")
                 func()
                 print("Decorator 1 after")
             return wrapper
      
         def decorator2(func):
             def wrapper():
                 print("Decorator 2 before")
                 func()
                 print("Decorator 2 after")
             return wrapper
      
         @decorator1
         @decorator2
         def say_hello():
             print("Hello!")
      
         say_hello()
      

      在这个例子中,say_hello函数首先被decorator2装饰,然后被decorator1装饰。当say_hello函数被调用时,装饰器会按照堆叠的顺序依次执行。

  3. 装饰类方法

    • 装饰器不仅可以用于函数,还可以用于类方法。以下是一个装饰类方法的示例:

         def timing_decorator(func):
             def wrapper(self, *args, **kwargs):
                 import time
                 start_time = time.time()
                 result = func(self, *args, **kwargs)
                 end_time = time.time()
                 print(f"Function {func.__name__} took {end_time - start_time} seconds.")
                 return result
             return wrapper
      
         class MyClass:
             def __init__(self):
                 self.data = [1, 2, 3, 4, 5]
      
             @timing_decorator
             def process_data(self):
                 for item in self.data:
                     print(item)
      
         obj = MyClass()
         obj.process_data()
      

      在这个例子中,timing_decorator装饰器被应用于MyClass类的process_data方法。它会测量方法的执行时间,并打印出执行时间的信息。

  4. 类作为装饰器

    • 类也可以作为装饰器。当一个类被用作装饰器时,它的__init__方法会接受被装饰的函数作为参数,而它的__call__方法会在函数被调用时执行。以下是一个类作为装饰器的示例:

         class MyDecorator:
             def __init__(self, func):
                 self.func = func
      
             def __call__(self, *args, **kwargs):
                 print("Before function call")
                 result = self.func(*args, **kwargs)
                 print("After function call")
                 return result
      
         @MyDecorator
         def add(a, b):
             return a + b
      
         print(add(3, 4))
      

      在这个例子中,MyDecorator类被用作装饰器。当add函数被调用时,MyDecorator类的__call__方法会在add函数被调用之前和之后执行一些操作。

四、实际应用场景

  1. 日志记录

    • 装饰器可以用于记录函数的调用信息,例如输入参数、输出结果和执行时间等。这对于调试和性能分析非常有用。

         def log_decorator(func):
             def wrapper(*args, **kwargs):
                 print(f"Calling function {func.__name__} with args {args} and kwargs {kwargs}")
                 result = func(*args, **kwargs)
                 print(f"Function {func.__name__} returned {result}")
                 return result
             return wrapper
      
         @log_decorator
         def multiply(a, b):
             return a * b
      
         multiply(3, 4)
      
  2. 性能测量

    • 装饰器可以用于测量函数的执行时间,以便优化代码性能。

         def timing_decorator(func):
             def wrapper(*args, **kwargs):
                 import time
                 start_time = time.time()
                 result = func(*args, **kwargs)
                 end_time = time.time()
                 print(f"Function {func.__name__} took {end_time - start_time} seconds.")
                 return result
             return wrapper
      
         @timing_decorator
         def slow_function():
             import time
             time.sleep(2)
      
         slow_function()
      
  3. 权限控制

    • 装饰器可以用于实现权限控制,确保只有授权的用户才能调用某些函数。

         def permission_required(permission):
             def decorator(func):
                 def wrapper(user, *args, **kwargs):
                     if user.has_permission(permission):
                         return func(user, *args, **kwargs)
                     else:
                         raise PermissionError(f"User {user} does not have permission to call {func.__name__}")
                 return wrapper
             return decorator
      
         class User:
             def __init__(self, name, permissions):
                 self.name = name
                 self.permissions = permissions
      
             def has_permission(self, permission):
                 return permission in self.permissions
      
         @permission_required("admin")
         def delete_user(user):
             print(f"Deleting user {user.name}")
      
         user1 = User("Alice", ["read", "write"])
         user2 = User("Bob", ["admin"])
      
         delete_user(user1)
         delete_user(user2)
      

五、总结

Python 装饰器是一种非常强大的工具,它可以在不修改原有代码的情况下,为函数、方法或类添加额外的功能。通过掌握装饰器的高级用法,你可以在日志记录、性能测量、权限控制等方面提高代码的可维护性和可扩展性。装饰器的灵活性和强大功能使得它们在 Python 编程中得到了广泛的应用。

标签:__,return,Python,代码,func,time,装饰,def
From: https://blog.csdn.net/liuhailong0511/article/details/142457793

相关文章

  • 联邦学习(Federated Learning)原理与代码实战案例讲解
    联邦学习(FederatedLearning)原理与代码实战案例讲解关键词:联邦学习集中式学习数据隐私保护分布式机器学习同态加密安全多方计算1.背景介绍1.1问题的由来随着大数据时代的到来,数据孤岛现象日益严重。许多组织拥有大量的本地数据,但由于法律、安全或商业原因,这些数据......
  • pip 命令:python包管理器
    一、命令简介​pip​是Python的包管理工具,用于安装和管理Python包。它通常用于在Python环境中安装第三方库或工具。安装pipDebian/Ubuntuaptsudoaptupdatesudoaptinstallpython3-pipCentOS/RHELyumsudoyuminstallpython3-pipdnfsudodnfinsta......
  • LLM大模型: Denoising Diffusion Probabilistic Models 原理解析与核心代码
      根据文本生成图片是AI的核心应用之一,2020年后主流的生成方式都是基于DenoisingDiffusionProbabilisticModels原理的,逐渐替代了之前使用GAN的方式生成图片!那么DDPM为啥能取代GAN了?其优势在哪?或者说GAN的劣势在哪?  1、CLIP模型都知道吧?text和image都通过各自的enco......
  • python request库的使用
    安装和使用        requests库支持python3.8+,注意版本pipinstallrequests    在项目中引用时如下:importrequests访问网站    request访问网站一般用get和post两种方式    get    requests库提供了get方法,可以用get方式访......
  • 计算机专业选题推荐-基于python的协同过滤酒店推荐系统
    精彩专栏推荐订阅:在下方主页......
  • Python中if语句使用详解!
    在Python语言中,if语句是一种条件语句,主要用于根据不同的条件执行不同的操作。接下来,小编通过这篇文章为大家详细讲解一下Python语言if语句,快来学习吧!1、基础语法在Python中,if语句的基本语法是:ifcondition:statement(s)如果条件condition为真,则执行if语句......
  • 买服务器跑代码是什么意思
    "买服务器跑代码"是指个人或组织购买一台服务器,并在上面部署和运行自己的软件代码,以提供特定的服务或执行某些计算任务。具体来说,这个过程通常涉及以下几个步骤:1.购买服务器根据需求选择合适的服务器硬件,可以直接购买物理服务器,也可以租用云服务器。选择时要考虑服务器的CPU、内存......
  • Nat Med.作者提供全文的绘图代码,对于学习作图很有帮助
    本期教程获得本期教程全文代码:在订阅号后台回复关键词:202409232022年教程总汇2023年教程总汇引言今天分享的文章是2024发表在NatMed.期刊中,来自上海交通大学医学院的文章,作者提供了全文的绘图代码,确实勇,对于学习绘图提供充分的素材。也是一个学习作图具重大意义......
  • 苍穹外卖学习日志 -----20天项目从零到完结-----含软件下载,环境配置,框架学习,代码编写,
    年份2024    基础:Javase  Javaweb已完结   2024  8.25---9.14  20天Day-01   8.25今天开始学习已经晚了,网盘下载了一下文件,做了一些开始项目的准备工作。本来其实打算用notepad++来写学习日志的,但是那个传不了图片,而且编辑视图没有这......
  • 震撼!AI实时生成游戏,每秒20帧,谷歌扩散模型最新突破一夜爆火,附论文介绍和GitHub代码
    震撼!AI实时生成游戏,每秒20帧,谷歌扩散模型最新突破一夜爆火,附论文介绍和GitHub代码。“比Sora还震撼”,AI可以实时生成游戏了!谷歌DeepMind打造出了首个完全AI驱动的实时游戏引擎——GameNGen。在单个谷歌TPU上,它以每秒20帧模拟起了经典射击类游戏DOOM(毁灭战士)。所有游戏画面都是根据......