Python装饰器

来自CloudWiki
跳转至: 导航搜索

闭包

闭包:在内部函数外封装了一层,具体执行时先执行外部函数,更新外部变量,然后再执行内部函数。

def addx(x):
    def adder(y):
        return x + y

    return adder


c = addx(8)
print(c(10))  #结果: 18

这样做的好处是,可以在不改变原有函数的基础上,通过封装一层壳,实现类似流水线的函数级联调用。可以极大地提高代码的可复用性。

def line_conf(a,b):
    def line(x):
        return a * x + b
    return line

line_A = line_conf(2,1) #定义直线A
line_B = line_conf(3,2) #定义直线B
line_C = line_conf(5,-3) #定义直线C

print(line_A(1))
print(line_B(1))
print(line_C(1))

装饰器的概念和使用

装饰器实际上是为了给某程序增添功能,但该程序已经上线或使用,无法大批量的修改源代码。

一般情况下,在满足以下三个条件下装饰器可以使用

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

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

3) 满足1)、2)的情况下给程序增添功能。

例2-22 Python通过闭包来计算函数执行时间

import time  #导入时间模块


def timer(func):  #封装的闭包函数
    def deco():
        start = time.time()
        func()
        stop = time.time()
        print(stop - start)

    return deco


def test():  #需要计时的函数
    time.sleep(2)


print("测试程序!")
test = timer(test)  #调用闭包函数
test()  #最终调用形式

例2-23 使用装饰器计算函数运行时间

import time  #导入时间模块


def timer(func):  #封装的闭包函数
    def deco():
        start = time.time()
        func()
        stop = time.time()
        print(stop - start)

    return deco


def test():  #需要计时的函数
    time.sleep(2)


print("测试程序!")
test = timer(test)  #调用闭包函数
test()  #最终调用形式

最后总结一下,装饰器的存在主要是为了不修改原函数的代码,也不修改函数调用形式 就能实现功能的拓展。