多层装饰
无参数的函数
def wrapper1(func):
print('进入wrapper1装饰器')
def inner():
print('真正执行装饰1')
func()
print('wrapper1装饰已经完成')
return inner
def wrapper2(func):
print('进入wrapper2装饰器')
def inner():
print('真正执行装饰2')
func()
print('wrapper2装饰已经完成')
return inner
@wrapper2
@wrapper1
def info():
print('这是被装饰的函数')
print('#######################')
info()
输出:
进入wrapper1装饰器
wrapper1装饰已经完成
进入wrapper2装饰器
wrapper2装饰已经完成
#######################
真正执行装饰2
真正执行装饰1
这是被装饰的函数
所以装饰 的时候是从内向外,执行的时候是从上到下
wrapper 中有2次func() 函数为什么只执行了一次 info 函数?
因为 wrapper1 中执行的是 第一次装饰后传入的info
有参数的函数的装饰
要将参数放在闭包里的函数中进行传递
例子:
def wrapper1(func):
print('进入wrapper1装饰器')
def inner(ads):
print('真正执行装饰1')
func(ads)
print('wrapper1装饰已经完成')
return inner
def wrapper2(func):
print('进入wrapper2装饰器')
def inner(fds):
print('真正执行装饰2')
func(fds)
print('wrapper2装饰已经完成')
return inner
@wrapper2
@wrapper1
def info(sqd):
print('参数:',sqd)
print('这是被装饰的函数')
print('#######################')
info('dsadasdasdasdasd')
装饰器工厂函数
def 工厂函数(分类参数):
if 分类参数==‘分类’
生成装饰器
return 装饰器
Time
先导入time 包
time是1970年到今的毫秒数
ctime 是 可以看的懂的时间
类装饰器
callable方法 就是判断是否 是 可调用的
一般来说 要有 __call__方法才算是可调用的
类中需要重写才能 成为可调用对象
在类中__init__方法中 传入函数
在 __call__方法 完善装饰器的装饰功能
例子:
class Authen(object):
def __init__(self,func):
self.__func = func
print(func)
def __call__(self, *args, **kwargs):
print('装饰器的装饰功能')
self.__func()
pass
@Authen
def info():
print('info')
info()