Python 装饰器

顾名思义,装饰器其实就是给一个函数加一些修饰功能,为什么不直接改函数源码呢?因为对于某些复杂的函数你没有耐性去阅读了,所以python提供了装饰器这个功能


## 闭包

闭包是指定义在一个函数内的函数,且调用了外部变量或对象,但不能是全局变量。

def outer():
    a = 1
    def inner():
        b = 2
        return a + b
    return inner

func = outer()
func()

装饰器本身也是一个函数,返回一个函数对象指针。

def decorator(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func()
        end = time.time()
        print(end - start)
    return wrapper

@decorator
def func():
    time.sleep(1)

func()

@语句实质上等于func = decorator(func)


## 装饰链
def makediv(func):
    return lambda: '<div>' + func() + '</div>'

def makep(func):
    return lambda: '<p>' + func() + '</p>'

@makediv
@makep
def func():
    return "Hello world."

func()  #  输出"<div><p>Hello world.</p></div>"

可见程序是从上往下依次执行的,func函数先被内层装饰器修饰

posted @ 2018-10-31 10:09  authetic  阅读(183)  评论(0编辑  收藏  举报