装饰器两个应用:
1. 计算函数次数
就是给函数添加计算次数的额外功能,这里使用装饰器非常方便
做法:在函数上面写一个装饰器,装饰器中闭包函数外部函数的参数指向了函数引用,通过外部函数的参数调用前后计算来统计函数次数
问题:计数起始值比如num=0是引用全局变量吗?
答案是否定的,因为全局变量整个程序共用,所以不安全。我们的做法是将计数起始值放到闭包外部函数定义下,这样比较安全。而参数调用在闭包内部函数下,所以这里需要使用nonlocal num 去访问,然后计数加1去计算调用次数
2. 计算函数时间
同样使用装饰器去做
做法在参数调用前后加记时时间,通过两者之差得到调用耗时
类装饰器:
类似将闭包封装到类中,闭包中外部函数的参数,通过初始化传入,而调用函数作为实例对象,通过使用实例对象()去自动调用__call__方法,因为参数指向了调用函数,所以__call__方法下,只需将参数()调用即可
装饰器传参:
在闭包基础上,最外层在定义一个函数,这个函数返回闭包外部函数引用,而这个函数的参数可以我们自己手动传入。
用法:在调用函数上写@定义函数(),记住()必须有。执行顺序先执行定义函数()再执行@闭包外部函数,此时相当于执行闭包装饰器