ITPub博客

首页 > 数据库 > 数据库开发技术 > Python中装饰器的基础使用

Python中装饰器的基础使用

原创 数据库开发技术 作者:derekwh 时间:2023-11-19 23:55:13 0 删除 编辑

Python在编写复杂算法的时候,使用装饰器可以让函数更简洁、复用率更高,减少重复造轮子。本文介绍Python中装饰器的使用方法。

装饰器概述

首先,我们需要了解什么是装饰器。装饰器本身是一个函数,它可以接收函数作为参数,并返回一个新的函数,被称为修饰过的函数。 

例如在函数执行前、执行中、执行后扩展原函数的功能;它还可以用于检查函数的参数,或者对函数的返回值进行修改等。

装饰器的基本使用

使用装饰器的方法非常简单,只需使用@符号和装饰器名称,放在需要装饰的函数定义之前。让我们看一个例子:

def my_decorator(func):
    def wrapper():
        print("执行函数前")
        func()
        print("执行函数后")
    return wrapper

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

say_hello()

上面的代码中定义了一个装饰器 my_decorator,接收一个函数作为参数,并返回一个修饰过的函数wrapper。 

wrapper函数在函数执行前输出一行文本,调用原函数func(),并在函数执行后输出一行文本。 

接下来,在函数say_hello()定义之前使用装饰器@my_decorator进行修饰。

最后,我们调用函数say_hello(),自动调用my_decorator 来修饰say_hello函数。

这就是装饰器的基本使用方法,它允许我们在函数执行前、执行中或执行后增加一些附加操作,而不必修改原函数的代码。

带参数的装饰器

装饰器有时需要传递一些参数,以根据不同的情况进行不同的操作。例如,我们想要一个能接收参数的装饰器,可以根据参数打印不同的信息。

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("执行函数前")
        func(*args, **kwargs)
        print("执行函数后")

    return wrapper

@my_decorator
def say_hello(name):
    print("Hello", name)
say_hello("world")

上面的代码中,我们要在函数执行前后打印一些信息,并且函数本身需要接收参数。这就需要使用带参数的装饰器。 

其中,*args和**kwargs是Python中的两个特殊语法,表示可变参数和关键字参数的用法。 

最后,将say_hello()用@my_decorator修饰,调用该函数。

多个装饰器

在Python中,一个函数可以装饰多个装饰器,以增强函数功能。多个装饰器的执行顺序与装饰器的定义顺序有关,最后在函数定义的地方叠加执行。

def my_decorator1(func):
    def wrapper():
        print("执行装饰器1前")
        func()
        print("执行装饰器1后")

    return wrapper

def my_decorator2(func):
    def wrapper():
        print("执行装饰器2前")
        func()
        print("执行装饰器2后")

    return wrapper
@my_decorator1
@my_decorator2
def say_hello():
    print("Hello world!")
say_hello()

上面的代码中,定义了两个装饰器my_decorator1和my_decorator2。

say_hello函数首先被my_decorator2装饰器修饰,然后再用my_decorator1修饰。在执行过程中,装饰器会按顺序执行。

类装饰器

除了函数装饰器,Python还支持类装饰器,它接受一个函数,并返回一个修饰后的函数。这与函数装饰器非常相似,只不过是使用类而不是函数。

class MyDecorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("执行函数前")
        self.func(*args, **kwargs)
        print("执行函数后")

@MyDecorator
def say_hello():
    print("Hello world")
say_hello()

上面的代码中,我们用类定义了一个装饰器MyDecorator,它有一个__init__ 方法和一个__call__方法。

其中,__init__方法接收一个函数作为参数,并存储在self.func变量中。

__call__方法调用函数前后打印一些信息,然后调用self.func函数本身。

最后,我们用@MyDecorator将函数say_hello()用MyDecorator装饰器修饰。

装饰器的应用场景

装饰器是Python中非常重要的概念之一,它可以用于各种场景。

  • 日志记录:使用装饰器来记录函数的调用过程,包括函数名称、参数和返回值等。 

  • 缓存数据:使用装饰器来缓存函数的计算结果,以加快函数的执行速度。 

  • 输入检查:使用装饰器来检查函数的输入参数是否符合要求。 

  • 认证授权:使用装饰器来检查用户的权限,以确保只有授权用户才能调用函数。

总结

本文介绍了Python中装饰器基本使用,包括定义装饰器、应用装饰器、多个装饰器和类装饰器等。

装饰器是Python中非常重要的概念之一,它可以帮助我们优雅地扩展代码的功能,从而使代码更加灵活、易于维护。

原文作者:Python学习杂记;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
央企算法工程师,微信公众号: python数智工坊

注册时间:2021-03-14

  • 博文量
    305
  • 访问量
    162352