searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

初识python装饰器

2023-08-25 08:50:06
9
0

一、装饰器的基本概念

Python装饰器(Decorator)是一种特殊的函数,其可以装饰其他的函数或类。所谓装饰,其实就是将其他的函数或类作为参数传入,在原有基础上添加一些新逻辑或者属性后,将这个新的函数或类返回的过程。

二、函数装饰器

装饰器通过使用@符号进行修饰,即函数decorator,该函数能以其他函数作为形参,并返回一个新的函数。如下述示例所示,以函数my_test()作为形参传递,最后返回一个新的函数即 return wrapper()。执行流程为,首先wrapper函数在调用原始函数前后会有一些其他操作,然后调用原始函数即my_test()并返回结果。原始函数经过装饰器的装饰形成了具有其他功能的形函数。

其中wrapper中的参数,*args表示将参数作为一个元组(tuple)传递给函数。它允许你传递任意数量的位置参数给函数,这些参数会被打包成一个元组传递给函数内部。函数内部可以使用 args 来访问这个元组,并对其中的参数进行操作。**kwargs 表示将参数作为一个字典(dict)传递给函数。它允许你传递任意数量的关键字参数给函数,这些参数会被打包成一个字典传递给函数内部。函数内部可以使用 kwargs 来访问这个字典,并对其中的参数进行操作。

示例如下:

具体的输出为:

 

三、类装饰器

类装饰器就是使用类来实现的装饰器。通过在类中定义 __call__ 方法来实现。当我们使用 @ 语法应用装饰器时,Python 会调用装饰器类的 __init__ 方法创建一个实例,然后将被装饰的函数或类作为参数传递给 __init__ 方法。当被装饰的函数或方法被调用时,Python 会调用装饰器实例的 __call__ 方法。

示例如下

具体的输出为:

在上述示例中,Decorator 类的实例被创建并将my_test函数作为参数传入,当调用my_test函数时即本质是调用装饰器中的__call__方法。

相比函数装饰器,类装饰器有几个主要优势。

(1) 更好的组织:类装饰器可以利用 Python 的面向对象特性,将相关的方法和数据封装在一起,这使得代码更易于理解和维护
(2) 更大的灵活性:类装饰器可以利用继承来复用和扩展代码。例如,你可以创建一个基础的装饰器类,然后通过继承这个类来创建特定的装饰器。
(3) 更好的控制:类装饰器可以使用实例变量来保存状态。这在一些需要保存状态的装饰器(例如计数器或缓存)中非常有用

 

三、总结

Python 的装饰器是一种强大的工具,能够提供更好的代码组织、更大的灵活性,提升代码的可复用性。

0条评论
0 / 1000
l****n
6文章数
0粉丝数
l****n
6 文章 | 0 粉丝
原创

初识python装饰器

2023-08-25 08:50:06
9
0

一、装饰器的基本概念

Python装饰器(Decorator)是一种特殊的函数,其可以装饰其他的函数或类。所谓装饰,其实就是将其他的函数或类作为参数传入,在原有基础上添加一些新逻辑或者属性后,将这个新的函数或类返回的过程。

二、函数装饰器

装饰器通过使用@符号进行修饰,即函数decorator,该函数能以其他函数作为形参,并返回一个新的函数。如下述示例所示,以函数my_test()作为形参传递,最后返回一个新的函数即 return wrapper()。执行流程为,首先wrapper函数在调用原始函数前后会有一些其他操作,然后调用原始函数即my_test()并返回结果。原始函数经过装饰器的装饰形成了具有其他功能的形函数。

其中wrapper中的参数,*args表示将参数作为一个元组(tuple)传递给函数。它允许你传递任意数量的位置参数给函数,这些参数会被打包成一个元组传递给函数内部。函数内部可以使用 args 来访问这个元组,并对其中的参数进行操作。**kwargs 表示将参数作为一个字典(dict)传递给函数。它允许你传递任意数量的关键字参数给函数,这些参数会被打包成一个字典传递给函数内部。函数内部可以使用 kwargs 来访问这个字典,并对其中的参数进行操作。

示例如下:

具体的输出为:

 

三、类装饰器

类装饰器就是使用类来实现的装饰器。通过在类中定义 __call__ 方法来实现。当我们使用 @ 语法应用装饰器时,Python 会调用装饰器类的 __init__ 方法创建一个实例,然后将被装饰的函数或类作为参数传递给 __init__ 方法。当被装饰的函数或方法被调用时,Python 会调用装饰器实例的 __call__ 方法。

示例如下

具体的输出为:

在上述示例中,Decorator 类的实例被创建并将my_test函数作为参数传入,当调用my_test函数时即本质是调用装饰器中的__call__方法。

相比函数装饰器,类装饰器有几个主要优势。

(1) 更好的组织:类装饰器可以利用 Python 的面向对象特性,将相关的方法和数据封装在一起,这使得代码更易于理解和维护
(2) 更大的灵活性:类装饰器可以利用继承来复用和扩展代码。例如,你可以创建一个基础的装饰器类,然后通过继承这个类来创建特定的装饰器。
(3) 更好的控制:类装饰器可以使用实例变量来保存状态。这在一些需要保存状态的装饰器(例如计数器或缓存)中非常有用

 

三、总结

Python 的装饰器是一种强大的工具,能够提供更好的代码组织、更大的灵活性,提升代码的可复用性。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0