python装饰器

来源:互联网 发布:平井一夫的微笑 知乎 编辑:程序博客网 时间:2024/06/03 16:58

一. 实现装饰器知识储备:

1. 函数即“变量”

2. 高阶函数

  • 把一个函数名当做实参传给另一个函数(实现了在不修改被装饰函数源码的情况下为其添加功能)

  • 返回值中包含函数名(实现了不修改函数的调用方式)

3. 嵌套函数

二 .装饰器定义:

本质就是函数(装饰其他函数)就是为其他函数添加附加功能的。

三. 原则:

1.不能修改被装饰的函数的源代码。

2.不能修改被装饰函数的调用方式。


例如:下面这段代码在通过写calcTime函数,在seek()函数的原有功能(即没有改变seek()函数内的任何代码)上添加了计算执行时间的新功能,但是调用方式发生了变化,因此还需优化才能达到装饰器的目标:

import timedef calcTime(func):    startTime = time.time()    func()    endTime = time.time()    print("this progress consume %s"%(endTime-startTime))def seek():    time.sleep(2.2)    print("i am seeking")calcTime(seek)


优化:

import timedef calcTime(func):    def deco():        startTime = time.time()        func()        endTime = time.time()        print("this progress consume %s"%(endTime-startTime))    return decodef seek():    time.sleep(2.2)    print("i am seeking")seek = calcTime(seek)#通过执行calcTime函数返回添加新功能函数的地址即decoseek()#调用新添加功能的函数deco


再优化:

Python里提供了语法糖,只需在被装饰的函数上添加@装饰函数名字即可

import timedef calcTime(func):    def deco():        startTime = time.time()        func()        endTime = time.time()        print("this progress consume %s"%(endTime-startTime))    return deco@calcTimedef seek():    time.sleep(2.2)    print("i am seeking")# seek = calcTime(seek) 不用这行代码了seek()

四. 总结:

Python装饰器很小巧,设计的很美。
Python装饰器在给已经上线的功能基础上添加新的功能非常常用,因为你不可能让开发者再次重写正在线上运行的函数。