一文掌握 Python 装饰器

什么是装饰器?

  • 装饰器是一种特殊类型的函数,可以更改函数的默认行为。
  • 装饰器可用于向函数或方法添加附加功能,例如缓存、日志记录或身份验证,而无需实际更改原始代码。
  • 装饰器本质上是一个包装函数,它接受另一个函数作为参数并返回一个新函数,该新函数为原始函数添加了附加功能。装饰器通常用于简化代码,使其更加模块化,并减少所需的样板代码量。

装饰器如何工作?

要理解装饰器在 Python 中的工作原理,将它们视为一个两步过程会很有帮助:

  1. 定义了装饰器函数,它接受另一个函数作为参数。
  2. 装饰器函数返回一个新函数,该函数为原始函数添加了附加功能。

这是一个简单的例子来演示它是如何工作的:

def my_decorator(func):
    def wrapper():
        print("Before the function is called.")
        func()
        print("After the function is called.")
    return wrapper
@my_decorator
def say_hello():
    print("Hello, world!")
  • 在上面的示例中,my_decorator 是一个接受另一个函数作为参数 (func) 的函数。
  • 然后它定义一个新函数(包装器),在调用 func 之前和之后打印一条消息。
  • @my_decorator 语法是将装饰器应用到 say_hello 函数的一种简写方式。这相当于调用 say_hello = my_decorator(say_hello)。
  • 当调用 say_hello 时,装饰器会自动应用,输出将如下所示:
Before the function is called.
Hello, world!
After the function is called.

需要使用Python装饰器的实时场景。

1. 测量执行时间

  • 假设创建了一个方法,要检查它花费了多少时间。
import time

def measure_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        execution_time = end_time - start_time
        print(f"Execution time: {execution_time} seconds")
        return result
    return wrapper

@measure_time
def my_function():
    time.sleep(2)

my_function()

2. 日志记录

  • 假设您想使用下面的代码片段来记录您的函数,您可以轻松地做到这一点。
def log_function(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function: {func.__name__}")
        print(f"Arguments: {args}")
        print(f"Keyword Arguments: {kwargs}")
        result = func(*args, **kwargs)
        return result
    return wrapper

@log_function
def my_function(x, y):
    return x + y

print(my_function(2, 3))

3. 输入验证

  • 下面的脚本用于验证调用函数时传递的参数。
def validate_input(func):
    def wrapper(*args, **kwargs):
        for arg in args:
            if not isinstance(arg, int):
                raise TypeError("Input arguments must be integers")
        for value in kwargs.values():
            if not isinstance(value, int):
                raise TypeError("Keyword arguments must be integers")
        return func(*args, **kwargs)
    return wrapper

@validate_input
def add_numbers(a, b):
    return a + b

print(add_numbers(2, 3))

相关文章

干货 | 一文讲清楚Python之装饰器

概念介绍装饰器(decorator),又称“装饰函数”,即一种返回值也是函数的函数,可以称之为“函数的函数”。其目的是在不对现有函数进行修改的情况下,实现额外的功能。最基本的理念来自于一种被称为“装饰...

Python修饰器,终极解释来了!

修饰器在本质上就是一个函数,可接收其他函数作为参数。接下来,让我们看看如何自定义一个修饰器#这个修饰器可在被修饰函数之前被执行 def xiushi1(func): print("定义...

Python 装饰器:如何改进代码的功能和可读性

什么是装饰器?用装饰器来扩展另一个函数的功能。通过使用装饰器,可以添加其他功能。为了定义装饰器,需要定义一个函数,该函数具有一个调用 wrapper 的函数和一个调用 func, 的参数,该参数是我们...

Python的装饰器还是不会?来看看这篇文章(建议收藏)

点赞、收藏、加关注,下次找我不迷路哈喽,各位 Python 爱好者们!今天咱们要一起来攻克 Python 里一个超实用却又让不少新手犯迷糊的知识点 —— 装饰器。别担心,全程用大白话,搭配例子,还有...

python装饰器详解

装饰器储备知识1:*args和**kwargs储备知识2:名称空间与作用域储备知识3:函数对象储备知识4:函数的嵌套定义储备知识 5:闭包函数喜欢编程的小伙伴可以加小编的Q群1026782549,进群...

Python中自带的三个装饰器

说到装饰器,就不得不说python自带的三个装饰器:1、@property 将某函数,做为属性使用@property 修饰,就是将方法,变成一个属性来使用。2、@classmethod 修饰类的方式带...