首页 > 编程语言 >Python 装饰器

Python 装饰器

时间:2022-09-06 09:55:45浏览次数:92  
标签: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
From: https://www.cnblogs.com/amboke/p/16660720.html

相关文章

  • 2022 年最适合游戏开发者使用的 10 个 Python 框架
    2022年最适合游戏开发者使用的10个Python框架供游戏开发人员立即使用的Python框架随着游戏编程语言的集成,游戏业务在最新的技术市场中蓬勃发展。在游戏创作者的编......
  • 解决python使用过程出现的问题
    关于报错“AttributeError:partiallyinitializedmodule‘requests‘hasnoattribute‘get‘的解决方法报错:AttributeError:partiallyinitializedmodule‘requests......
  • python3下载及安装教程(Windows)
    Python目前已支持所有主流操作系统,在Linux,Unix,Mac系统上自带Python环境,一般默认装的是Python2版本,Windows系统上没有Pyhton环境,需要我们手动安装一下,现在一般都是python3......
  • Python源码解析-dict的底层实现(PyDictObject)
    目录简介PyDictObject对象类型创建dict缓存池本文基于Python3.10.4。简介元素与元素之间通常可能会存在某种联系,这个联系将两个元素关联在一起。为了刻画这种关联关系,编......
  • Python3中二叉树前序遍历的迭代解决方案
    Python3中二叉树前序遍历的迭代解决方案ABinaryTree二叉树是分层数据结构,其中每个父节点最多有2个子节点。在今天的文章中,我们将讨论一个在大量技术编码面试中出现......
  • Python 中的进程管道
    Python中的进程管道问题需求:需要在终端执行一条命令,但是输出的时间非常长,为了响应终端的输出又不影响程序的执行,将输出内容进行异步启动并将终端输出的内容存放至管道中,......
  • 用于清理数据的 5 个简单但功能强大的 Python 脚本
    用于清理数据的5个简单但功能强大的Python脚本面对现实吧。通常,数据清理可能会让人头疼,而不是因为复杂性。通常情况下,我对进行数据清理的想法感到畏缩,因为它变得如此......
  • 使用 Python 进行替换加密
    使用Python进行替换加密大家好。我是阿齐兹·诺扬。在本文中,我们将讨论什么是替代加密,它是如何工作的,如何在python中进行高级和简单的替代加密。如果你的座位、玉米和......
  • 高斯消去法(Gauss-Jordan方法)的Python实现
    高斯消去法的改进形式为Gauss-JordanEliminationMethod,要求每一行的主元素所在列元素全部消去为0,除了主元素本身。区别如下:代码实现如下:#-*-coding:utf-8-*-#@......
  • Python 内置函数 repr() 和str()
    Python内置函数repr()和str()1.相同点repr()和str()都是python的内置函数,都是object类分方法,且都是将一个对象转变成字符串形式,每个类都默认有这两个方法。。。。一......