装饰器
装饰器提供了一种插入自动运行代码(在函数和类定义完成之后)的方法。python里面装饰器有两种: 1.函数装饰器 2.类装饰器。装饰器共有两种用途: 1. 管理函数调用和实例创建 2. 管理函数和类
装饰器使代码更易维护和美观,如果不使用装饰器,这些功能也可实现。
函数装饰器
函数装饰器:装饰函数的装饰器
函数装饰器其本质是在函数定义完成之后自动运行另一个函数,把原函数重新绑定到其他可调用对象上。主要用途: 1. 装饰函数或方法, 2. 管理函数。
|
|
类装饰器
类装饰器:装饰类的装饰器
主要用途: 1. 管理实例的创建 2. 管理类
|
|
装饰器嵌套
|
|
装饰器参数
本质是首先执行一个函数,该函数返回一个装饰器。
|
|
保持状态信息的地方
- 类实例属性
- 全局作用域
- 封闭作用域 nonlocal(3.x)
- 函数属性
待深究
- 使用描述符装饰方法(38章 类错误之一:装饰类方法)
函数装饰器VS类装饰器
仔细分析一下代码,一个retry是类装饰器,一个是函数装饰器,都能成功吗?为什么?
结论: 基于函数的装饰器既可以装饰函数也可以装饰方法,基于类的装饰器只能装饰函数
|
|
进阶篇
使用装饰器有很多优点,但是也带来了一个很让人头痛的问题,就是debug。比如看下面的代码
|
|
注意点
- 装饰器只执行一次,在函数或类定义的时候,记住不是调用的时候
- 装饰函数的装饰器是函数装饰器,装饰类的装饰器是类装饰器。函数和类装饰器有两种形式:基于函数的装饰器和基于类的装饰器
- 装饰器的本质是接收一个被包装的函数,返回一个接收参数的可调用对象。
- 带参数的装饰器的本质是首先执行一个函数,然后返回一个装饰器