1、普通装饰器普通装饰器可以在执行一个方法的时候,为该方法额外添加一些行为,这个被装饰的方法可以有参数,也可以没有参数,比如下面的计时器装饰器。
2、我们可以看到这个timer装饰器执行后的返回值是内部函数deco的引用,deco在执行的过程中会为func计时。使用timer装饰器:
3、test_timer1方法没有参数,test_timer2方法有一个参数。执行被装饰的方法与没有装饰器时是一样的
4、处理带返回值的函数时,装饰器没有什么变化,只要在内部函数执行完返回结果即可:
5、带参数的装饰器:装饰器本身也是可以带参数的,对于这类装饰器,使用的时候如下:
6、从上面代码可以看出,使用装饰器的时候是按照“@装饰器名(参数)”的形式完成的,这种形式其实就是方法的执行,也就是引用装饰器的时候就会执行装饰器,所以声明新装饰器的时候,装饰器的参数必须于引用装饰器一致。下面是新的装饰器:
7、从以上代码可以看出,对于有参数的装饰器,代码书写方式就是在普通装饰器外部再额外嵌套一层,接收的参数可以在任意内部代码中引用。上面代码的执行结果:
8、补充说明:如果光看代码的话,可能不太好理解装鹘埙沃础饰器,那么我们可以调试一下。当断点放在装饰器引用位置的时候,可以看到代码会进入装饰器内部并返回内部函数:
9、对于有参数的装饰器,会先调用第一层的内部函数(就是普通装饰器的调用),然后饭后第二层内部函数: