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

了解Python中的装饰器函数和用法

发布时间:2023-06-01 03:05:43

Python是一门高级编程语言,其中装饰器函数(Decorator)是Python中重要的特性之一。装饰器函数由@标记符和函数名组成,最初是在Python 2.4版本中引入的。

装饰器的作用是修改或增强已有的函数的功能,而装饰器函数本身是一个函数接受其他函数作为参数,返回一个新的函数给调用者。装饰器通常用来实现AOP编程(Aspect-Oriented Programming,面向切面编程),例如添加日志、计时器、缓存等操作,以提高程序的可维护性和扩展性。

下面简单介绍Python中装饰器的用法和实现方法。

一、装饰器的语法

装饰器的语法如下所示:

@decorator
def function():
    pass

其中,@符号紧跟着装饰器的名称,把装饰器函数放在函数def关键字的上方。

二、最简单的装饰器

下面是最简单的装饰器示例,打印出函数调用时间:

import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print('cost time: {}s'.format(end - start))
        return result
    return wrapper

@timeit
def foo(x):
    time.sleep(x)

foo(1)

输出结果为:

cost time: 1.00033211708s

在foo函数上面加上@timeit装饰器,表示运行foo函数时调用timeit函数进行装饰。timeit函数接收一个函数作为参数,返回一个新函数作为装饰后的函数。

在新函数中,首先记录函数开始时间,调用原始函数,记录函数结束时间,并打印出函数调用花费的时间。

三、带参数的装饰器

装饰器可以带参数,例如:

def repeat(num):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(num):
                print('Repeat {}th, result: {}'.format(i+1, func(*args, **kwargs)))
        return wrapper
    return decorator

@repeat(num=3)
def foo():
    return 42

输出结果为:

Repeat 1th, result: 42
Repeat 2th, result: 42
Repeat 3th, result: 42

在装饰器函数中定义一个新的函数,接收原始函数作为参数,再定义一个wrapper函数作为装饰后的函数。在新函数中覆盖原来的函数,加上自己想要的功能,例如在foo函数中,扩展了一个repeat(num)函数用来重复调用foo函数。

四、嵌套的装饰器

装饰器也可以嵌套使用,例如:

def bold(func):
    def wrapper():
        return "<b>{}</b>".format(func())
    return wrapper

def italic(func):
    def wrapper():
        return "<i>{}</i>".format(func())
    return wrapper

@italic
@bold
def hello():
    return "hello, world!"

hello()

输出结果为:

<i><b>hello, world!</b></i>

在上面代码中,先使用bold装饰器去装饰函hello,再使用italic装饰器去装饰装饰过后的函数。最终输出结果是:

<i><b>hello, world!</b></i>

此外,还有一些Python内置的装饰器,例如classmethod,staticmethod等,可以让类方法的调用变得更加灵活和高效。

总结:

Python中的装饰器函数是一种非常实用的工具,它可以让我们方便地实现AOP编程,有效地提高代码的可维护性和扩展性。在实际开发中,我们可以结合Python内置装饰器和自定义装饰器来实现各种功能。