什么是装饰器?
装饰器的本质是一个函数,其作用是用来装饰其他的函数,给其他函数附加行的功能。
原则:
1.不能修改被装饰函数的源码。
2.不能改变被装饰函数的调用方式。
那么什么是函数?
简单的来说:将一段代码逻辑,通过特殊的语法组织起来,可有参数,可有返回值,能够在
别的地方被调用。python中函数是可以有参数也可以没有参数,可以有返回值,也可以没有。默认返回None.
理解下面三句话:
1.函数也是可以是变量
函数也可以作为参数,函数也可以作为返回值
2.高阶函数
以函数作为参数,作者返回值是函数的函数
3.函数嵌套
函数里面定义函数
装饰器 = 高阶函数 + 函数嵌套
装饰器的应用场景:插入日志,性能测试,处理事物,权限验证等
现在有一个需要,测试一个函数的运行时间
#!/user/bin/env python3 # -*- coding:utf-8 -*- import time def my_time(func): def wrapper(*args, **kwargs): start_time = time.time() ret = func(*args, **kwargs) end_time = time.time() print("{}函数运行了{}秒".format(func.__name__, (end_time - start_time))) return ret return wrapper # 注意不能是wrapp() @my_time # 相当于f=my_time(f(x,y)) def f(x, y): ret = x + y print("helle world") time.sleep(2) return ret print(f(3, 4))
代参数的装饰器
#!/user/bin/env python3 # -*- coding:utf-8 -*- def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print("[{level}]: enter function {func}()".format( level=level, func=func.__name__)) return func(*args, **kwargs) return inner_wrapper return wrapper @logging(level='INFO') def say(something): print("say {}!".format(something)) # 如果没有使用@语法,等同于 # say = logging(level='INFO')(say) if __name__ == '__main__': say('hello')
下面是一个日志的装饰器
def log(func): def wrapper(*args, **kwargs): print("begin call{}".format(func.__name__)) temp = func(*args, **kwargs) print("after call %s" % func.__name__) return temp return wrapper
刚刚开始入门,未在实际工厂环境中实际运用。后面还有类装饰器,内置的装饰器等,还有就是装饰器中的坑和优化,在实际过程中遇到再说,先入门。