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

Python中装饰器函数的使用及示例

发布时间:2023-06-20 11:52:27

一、定义

装饰器(decorator)是Python语言中一种很常用的语法。可以动态地给一个对象添加一些额外的功能,但不改变它的结构。

装饰器本质上是一个函数,它可以使其他函数在不需要修改源代码的情况下添加一些附加功能,并且可以用于修改或增强函数的功能。

装饰器也可以作为组件来使用。因此,装饰器函数应该接受一个函数对象作为参数,然后返回一个包装后的函数对象。

二、使用

在Python中,装饰器函数是很灵活的,它可以被设计用来在函数定义时自动地对函数进行处理。

装饰器函数可以充当函数的“包装器”,可以添加到现有的函数的调用链中,从而增强函数的性能、功能或中间件。它的主要目标是避免代码重复,并使方法更简单。

三、示例

下面我们来看一个例子,来看看装饰器函数的使用。

示例1:实现一个简单的装饰器

实现一个装饰器,可以在函数执行前后输出"start"和"end"。代码如下:

def deco(func):
    def wrapper():
        print("start")
        func()
        print("end")
    return wrapper

@deco
def test():
    print("test")
    
test()

运行结果如下:

start
test
end

这个装饰器作为一个函数来定义,它接受一个函数作为参数(func),并返回一个包装后的函数(wrapper)。

在实际使用时,使用@deco装饰器来调用test函数,相当于test = deco(test),这样就会在执行test函数前后自动调用deco函数,并输出"start"和"end"。

示例2:实现一个带参装饰器

实现一个带有参数的装饰器,可以根据不同参数实现不同修改。代码如下:

def deco(arg):
    def _deco(func):
        def wrapper(*args, **kwargs):
            print("before  %s with arg %s" % (func.__name__, arg))
            func(*args, **kwargs)
            print("after %s with arg %s" % (func.__name__, arg))
        return wrapper
    return _deco

@deco("decorator")
def func(num1, num2):
    print(num1 + num2)
    
func(2, 4)

运行结果如下:

before func with arg decorator
6
after func with arg decorator

这个装饰器是一个带有参数的函数,它接受一个参数arg,这个函数返回一个不带参数的函数_deco,并把参数传递给wrapper函数。

wrapper函数用*args和**kwargs来获取任意数量和任意类型的参数,并且在输出前后输出日志。

在实际使用时,@deco("decorator")静态调用deco函数,把参数传递给它,并返回_deco函数,然后_decor函数传递给它的函数参数func,并返回wrapper函数。最后,执行wrapper函数。