Python中的装饰器

112 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

装饰器

  • 装饰器利用闭包以及函数也可以作为函数参数传递的特性,让函数在执行之前或之后执行一些操作。如@classmethod@staticmethod可以将一个普通函数设置为类方法和静态方法。
  • 在项目开发中,经常会遇到一些需要登录后才能进行的操作,如果在每次进行操作的函数中都要添加同样判读登录的代码,会很麻烦并且代码很难维护,而自定义装饰器就就可以很好的解决这个问题。

类方法装饰器@classmethod

  • 类方法是属于这个类,
  • 类实例和类对象可以调用类方法
  • 类方法需要传入参数cls

image.png

静态方法装饰器@staticmethod

  • 静态方法属于这个类,只能通过类名调用
  • 静态方法中不能调用类属性
  • 静态方法中不能调用类属性,要调用只能通过类名调用
  • 静态方法不需要传入任何参数

image.png

自定义装饰器

闭包

  • 如果在一个函数中定义了另一个函数,并且里面定义的函数定义了外面函数作用作用域内的变量,并且外面的函数返回了里面定义函数的引用,那么里面的函数被称为闭包。

image.png

nonlocal关键字

  • nonlocal关键字用于闭包中,如果需要在闭包中修改外层函数作用域中的变量,就要使用nonlocal关键字,将变量标识为外层函数变量。
  • 下面代码在闭包中修改了外层变量name,如果不使用nonlocal name标识变量,则会报错:

image.png

被装饰的函数不带参数用法

image.png

被装饰的函数带有参数用法

image.png

装饰器带参数用法

image.png

wraps装饰器

  • 采用前面的提到装饰器用法,会让原本的函数失去一些属性,比如__name__,如edit_user()不使用装饰器时__name__值为函数名edit_user,使用装饰器时值为inner_wrappre。但在实际开发中,我们希望保留函数的一些属性,此时可以使用wraps装饰器来解决这个问题。
  • 优化代码如下:

image.png