欢迎访问宙启技术站
智能推送

在Python函数中如何使用装饰器?

发布时间:2023-12-03 19:29:19

在Python中,装饰器是一种用于修改函数或者类的行为的特殊函数。装饰器的语法使用@符号,接在待装饰的函数定义之前。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。

装饰器的主要目的是在不修改被装饰函数源代码的情况下,扩展其功能或者修改其行为。通过装饰器,我们可以将一些通用的代码逻辑应用在多个函数上,提高代码的可重用性和可维护性。

下面是一些使用装饰器的例子:

1.装饰器的基本用法:

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

@my_decorator
def my_function():
    print("Inside my function")

my_function()

输出:

Before function is called
Inside my function
After function is called

在上述例子中,my_decorator是一个装饰器函数,它接受一个函数作为参数func。装饰器内部定义了一个名为wrapper的函数,它在调用被装饰函数前后打印一些额外信息。最后,装饰器返回了wrapper函数作为新的函数。

通过在my_function函数定义之前加上@my_decorator,我们将my_function函数传递给my_decorator装饰器函数进行装饰,实际上就相当于执行了my_function = my_decorator(my_function)

2.带参数的装饰器:

def repeat(n):
    def decorator(func):
        def wrapper():
            for _ in range(n):
                func()
        return wrapper
    return decorator

@repeat(3)
def hello():
    print("Hello, world!")

hello()

输出:

Hello, world!
Hello, world!
Hello, world!

在此例中,装饰器repeat接受一个参数n,这个参数用于指定被装饰函数执行的次数。装饰器本身是一个函数,接受待装饰函数作为参数,并返回一个新的装饰函数。在新的装饰函数wrapper中,通过循环执行被装饰函数func

通过@repeat(3)语法,我们将hello函数传递给装饰器repeat进行装饰,实际上就相当于执行了hello = repeat(3)(hello)

3.带有参数的被装饰函数:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function: {func.__name__}")
        print(f"Args: {args}")
        print(f"Kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"Result: {result}")
        return result
    return wrapper

@logger
def add(a, b):
    return a + b

add(2, 3)

输出:

Calling function: add
Args: (2, 3)
Kwargs: {}
Result: 5

在这个例子中,装饰器logger接受一个函数func作为参数。装饰器内部定义了一个接受任意参数的函数wrapper。在wrapper函数内部,我们可以打印出调用的函数名、参数和返回值,并执行原始函数func。最后,装饰器返回了wrapper函数作为新的函数。

add(2, 3)调用中,logger装饰器会将add函数的调用信息打印出来,并执行原始函数add。最后,将原始函数的返回值返回。

通过上述例子,我们可以看到装饰器的用途。装饰器可以用于实现缓存、日志、权限检查等功能,从而提高代码的可重用性和可维护性。以少量代码实现了一些通用的功能,通过装饰器可以在需要时轻松应用到多个函数上。