【python】装饰器的原理

摘要:装饰器的原理是利用了Python的函数特性,即函数可以作为参数传递给另一个函数,也可以作为另一个函数的返回值。装饰器本质上是一个接受一个函数作为参数,并返回一个新函数的函数。这个新函数通常会在执行原函数之前或之后添加一些额外的功能,从而实现对原函数的修改或增强

装饰器的原理是利用了Python的函数特性,即函数可以作为参数传递给另一个函数,也可以作为另一个函数的返回值。装饰器本质上是一个接受一个函数作为参数,并返回一个新函数的函数。这个新函数通常会在执行原函数之前或之后添加一些额外的功能,从而实现对原函数的修改或增强。装饰器的语法是使用@符号,放在原函数的定义之前,表示将原函数作为参数传递给装饰器函数,并将返回的新函数替换原函数。

例如,下面是一个用于计算函数运行时间的装饰器的例子:

import timedef my_decorator(func): # 定义一个装饰器函数 def wrapper(*args, **kwargs): # 定义一个包装函数 start_time = time.time # 记录开始时间 result = func(*args, **kwargs) # 调用原函数 end_time = time.time # 记录结束时间 print("Function took {:.6f} seconds.".format(end_time - start_time)) # 打印运行时间 return result # 返回原函数的结果 return wrapper # 返回包装函数@my_decorator # 使用装饰器def my_function(x): # 定义一个需要被装饰的函数 time.sleep(x) # 模拟耗时操作 return x # 返回参数print(my_function(2)) # 调用被装饰的函数

输出结果是:

Function took 2.000163 seconds.2

可以看到,装饰器函数my_decorator接收一个函数func作为参数,并返回一个包装了原始函数的新函数wrapper。在wrapper函数中,我们在调用原始函数之前和之后分别记录了时间,并打印了运行时间。当我们使用@my_decorator修饰my_function时,相当于执行了my_function = my_decorator(my_function),即将my_function替换为wrapper。因此,当我们调用my_function时,实际上是调用了wrapper,从而实现了对my_function的修改。

来源:自由坦荡的湖泊AI一点号

相关推荐