开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
装饰器
- 装饰器利用闭包以及函数也可以作为函数参数传递的特性,让函数在执行之前或之后执行一些操作。如
@classmethod和@staticmethod可以将一个普通函数设置为类方法和静态方法。 - 在项目开发中,经常会遇到一些需要登录后才能进行的操作,如果在每次进行操作的函数中都要添加同样判读登录的代码,会很麻烦并且代码很难维护,而自定义装饰器就就可以很好的解决这个问题。
类方法装饰器@classmethod
- 类方法是属于这个类,
- 类实例和类对象可以调用类方法
- 类方法需要传入参数
cls
静态方法装饰器@staticmethod
- 静态方法属于这个类,只能通过类名调用
- 静态方法中不能调用类属性
- 静态方法中不能调用类属性,要调用只能通过类名调用
- 静态方法不需要传入任何参数
自定义装饰器
闭包
- 如果在一个函数中定义了另一个函数,并且里面定义的函数定义了外面函数作用作用域内的变量,并且外面的函数返回了里面定义函数的引用,那么里面的函数被称为闭包。
nonlocal关键字
nonlocal关键字用于闭包中,如果需要在闭包中修改外层函数作用域中的变量,就要使用nonlocal关键字,将变量标识为外层函数变量。- 下面代码在闭包中修改了外层变量
name,如果不使用nonlocal name标识变量,则会报错:
被装饰的函数不带参数用法
被装饰的函数带有参数用法
装饰器带参数用法
wraps装饰器
- 采用前面的提到装饰器用法,会让原本的函数失去一些属性,比如
__name__,如edit_user()不使用装饰器时__name__值为函数名edit_user,使用装饰器时值为inner_wrappre。但在实际开发中,我们希望保留函数的一些属性,此时可以使用wraps装饰器来解决这个问题。 - 优化代码如下: