装饰器(Python)

装饰器(decorators)是 Python 的一个重要部分。简单地说:装饰器是修改其他函数的功能的函数,能让我们的代码更容易被扩展,更加简短。
举个例子:

 

def login():
    print("登录中...")
login()

这是最简单的一个函数,直接调用必然是执行了print()吧。既然是模拟登录,那是不是应该加一些功能扩展一下呢,在不修改原函数的情况下,那么,装饰器来啦。
我们再定义一个装饰器(本质上是函数,符合闭包的特点) - decorator:http://yuyou10.nx04.com http://yuyou11.nx04.com http://yuyou12.nx04.com http://yuyou13.nx04.com http://yuyou14.nx04.com http://yuyou15.nx04.com http://yuyou16.nx04.com http://yuyou17.nx04.com http://yuyou18.nx04.com

def decorator(func):
    check = '正在校验...'
    finshed = '校验完毕...'

    def pack():
        func()
        print(check)
        print(finshed)

    return pack

可以看到,这个装饰器的参数是函数,内部又封装了一个函数pack()(就是用来扩展login()的啦),最后将内部的pack()函数给返回;那么现在接着来使用一下装饰器吧。

 

@decorator    # 加上装饰器@decorator
def login():
    print("登录中...")


if __name__ == '__main__':
    login()  # 加上装饰器后再执行
'''
运行结果:
    登录中...
    正在校验...
    校验完毕...
'''

这样是不是就实现了不改变原有代码的情况下又进行了扩展呢。那为什么 在原函数前加上 @decorator 之后就做到这些动作了呢?那我们继续来看看,这玩意儿有什么作用。
将装饰器稍微修改一下,然后先不调用login(),看看会发生什么:http://yuyou00.nx04.com http://yuyou01.nx04.com http://yuyou02.nx04.com http://yuyou03.nx04.com http://yuyou04.nx04.com http://yuyou05.nx04.com http://yuyou06.nx04.com http://yuyou07.nx04.com http://yuyou08.nx04.com

def decorator(func):
    print("=======装饰器开始加载=======")
    check = '正在校验...'
    finshed = '校验完毕...'

    def pack():
        func()
        print(check)
        print(finshed)

    print("=======装饰器加载完毕======")
    return pack


@decorator    # 加上装饰器@decorator
def login():
    print("登录中...")


if __name__ == '__main__':
    # login()
    pass

装饰器(Python)_第1张图片

可见,普通函数加上 ‘@装饰器’ 之后默认执行了装饰器的函数,这里也就是执行了print语句之后又默默声明了pack()并且返回,那它返回给了谁?想都不用想,肯定跟login()有关啦。这里不调用,直接打印一下被装饰之后的login,看看是什么内容:

if __name__ == '__main__':
    # login()
    print(login)

装饰器(Python)_第2张图片
所以得出结论:

函数加上装饰器,装饰器会默认自动加载,并且将内部封装的函数直接返回给被装饰者。

你可能感兴趣的:(装饰器(Python))