ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 装饰器

2022-09-06 10:03:48  阅读:213  来源: 互联网

标签:function Python some def func time 装饰 decorator


Python 装饰器

假设我们想为已经编写的代码添加额外的功能,例如我们想在一个特殊的 try catch 块中捕获任何错误,我们可以按如下方式进行。

 def some_decorator(func):  
 def try_except_block(*args, **kwargs):  
 尝试:  
 func(*args, **kwargs)  
 除了例外:  
 打印(例外)  
 返回 try_except_block[ @some_decorator](https://twitter.com/some_decorator)  
 def some_function():  
 打印(“你好世界”)  
      
 一些函数()

这里 some_decorator 是一个修饰函数,它修改了 some_function 的行为。如您所见,由于我们使用 *args、**kwargs,因此对 some_function 的参数没有限制。

还有另一种实现装饰器的方法。让我们看下面的示例来计算函数运行所花费的时间。

 从 ast 导入 arg  
 进口时间  
 导入数学 def some_decorator(func):  
 def time_taken_block(*args, **kwargs):  
 begin_time = time.time()  
 func(*args, **kwargs)  
 end_time = time.time()  
 print("", func.__name__, " is ", end_time - begin_time)  
 返回 time_taken_block def some_function():  
 时间.sleep(2)  
 打印(“你好世界”) some_function = some_decorator(some_function)  
 一些函数()

这里不是在我们要运行的函数的顶部指定装饰器,而是通过将其插入到装饰器函数中并调用修改后的函数来修改函数调用。

但是,对于最佳编码实践,请使用以前的方法,因为它更容易追溯。如果您在以前的方法中使用上述方法,您可能会遇到以下问题。

 进口时间 def some_decorator(func):  
 def time_taken_block(*args, **kwargs):  
 begin_time = time.time()  
 func(*args, **kwargs)  
 end_time = time.time()  
 print("花费的总时间", func.__name__, "is", end_time - begin_time)  
 返回 time_taken_block[ @some_decorator](https://twitter.com/some_decorator)  
 def some_function():  
 """睡两秒钟。"""  
 时间.sleep(2)  
 打印(“你好世界”) 一些函数()  
 打印(some_function.__name__)  
 打印(some_function.__doc__) # 你好世界  
 # some_function 花费的总时间是 2.0111606121063232  
 # time_taken_block  
 # 没有任何

这里函数名和文档被装饰器替换,为了解决这个问题,我们使用 functools 包装函数并传递装饰函数名。

 导入功能工具  
 进口时间 def some_decorator(func):  
    [ @functools](https://twitter.com/functools) .wraps(函数)  
 def time_taken_block(*args, **kwargs):  
 begin_time = time.time()  
 func(*args, **kwargs)  
 end_time = time.time()  
 print("花费的总时间", func.__name__, "is", end_time - begin_time)  
 返回 time_taken_block[ @some_decorator](https://twitter.com/some_decorator)  
 def some_function():  
 """睡两秒钟。"""  
 时间.sleep(2)  
 打印(“你好世界”) 一些函数()  
 打印(some_function.__name__)  
 打印(some_function.__doc__) # 你好世界  
 # some_function 花费的总时间是 2.00304913520813  
 # some_function  
 # 休眠两秒。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/18618/46410609

标签:function,Python,some,def,func,time,装饰,decorator
来源: https://www.cnblogs.com/amboke/p/16660720.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有