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

装饰器:Python函数式编程概念的应用

发布时间:2023-06-18 16:43:41

装饰器是Python函数式编程概念的重要应用之一。它可以在不改变原函数代码的情况下,为函数添加额外的功能,相当于给函数“装饰”上新的特性,因此称之为装饰器。

常用的装饰器有:@classmethod、@staticmethod等,它们可以直接应用在类中的函数上,也可以添加到普通函数上。

下面通过一个简单的例子来了解装饰器的实现过程,我们定义一个函数,输出字符串的长度,并在函数前添加一个装饰器,用于输出函数执行时间:

import time

def add_time(f):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = f(*args, **kwargs)
        end_time = time.time()
        print("函数执行时间为:",end_time - start_time)
        return result
    return wrapper

@add_time
def get_len(s):
    return len(s)

print(get_len("hello world!"))

运行代码,输出:

函数执行时间为: 8.821487426757812e-06  
12

我们可以看到,在调用函数get_len时,装饰器add_time先执行了,统计了函数执行时间,并在输出结果后返回了结果。这样,我们不需要改变函数get_len的内容,就可以为其添加新的特性。

同时,装饰器还有一个很奇妙的特性,我们可以通过多个装饰器,为一个函数添加多个特性,如:

import time

def add_time(f):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = f(*args, **kwargs)
        end_time = time.time()
        print("函数执行时间为:",end_time - start_time)
        return result
    return wrapper

def add_info(f):
    def wrapper(*args, **kwargs):
        print("函数名为:", f.__name__)
        return f(*args, **kwargs)
    return wrapper

@add_time
@add_info
def get_len(s):
    return len(s)

print(get_len("hello world!"))

运行代码,输出:

函数名为: wrapper
函数执行时间为: 1.1920928955078125e-06
12

可以看到,在函数调用时,add_info先应用,输出函数名为wrapper,然后add_time应用,输出函数执行时间。

总结一下,装饰器是Python函数式编程概念的重要应用之一,它可以为函数添加新的特性,同时不改变函数原有的功能。在日常编程中,我们可以通过定义自己的装饰器,来简化重复的代码,并且增加代码的可读性。