Python学习之路-初学篇之初识装饰器

Python 装饰器:

装饰器(decorator)是一种高级Python语法

顾名思义, 装饰器是用来装饰已经存在的函数,这个存在的函数已经实现了某些功能,而且这个函数不能被修改的情况下,想对这个函数的功能进行扩展。

这个时候就需要用到装饰器。

例如需要在函数运行前后打印一条日志, 但是又不希望或者没有权限修改函数内部的结构, 就可以用到装饰器(decorator):

一、简单装饰器:

希望在调用某个功能函数之前进行验证:

def login(main_func):    # 定义装饰器函数
    def inner(request,kargs):
        print('Logon')
        main(request,kargs)        
    return inner
@login
def show(request,kargs):          # 功能函数,不能修改
    print('show')

装饰器接收一个可调用对象作为输入参数,在装饰器函数里面又定义了一个新的函数inner(), 在inner()中写入验证的代码,验证成功之后再调用我们的功能函数Show()

当程序运行到@login时,相当于是运行show  = login(show)其实是进行了两个步骤:

1.调用这个装饰器函数时,因为在函数里面还定义了一层函数,暂时不执行第二层的函数,而是直接return 第二层函数对象inner.

2. 把装饰器函数的return值也就是inner函数指向给变量show

当调用show(), 其实是先执行inner函数中的语句,打印'Logon' 再执行原来的show()功能函数。

通过这个装饰器达到扩功能的目的。

注: @login是 Python 语法糖的用法, 相当于 func = login(func)

 

二、带参数的装饰器

 

大家都知道函数是可以带参数的。 装饰器也是个函数, 那装饰器可不可以带参数呢。 例如调用的时候是这样的写法@login(*kargs, **wkargs)

示例代码如下:

def login(request, kargs):
    print('befor') def error_handle(request,kargs): print('after') def w1(before_func, after_func): def outer(main_func): def wapper(request, kargs): before_func(request, kargs) main_func(request, kargs) after_func(request, kargs) return wapper return outer @w1(login, error_handle) def index(request, kargs): print('index')

带参数的装饰器的运行顺序如下:

在遇到@w1(login, error_handle),先执行 w1(login, error_handle)函数。该函数的返回值是outer 那其实就是@outer

这样的执行顺序就和上文的简单装饰器的运行原理一致。

 

你可能感兴趣的:(Python学习之路-初学篇之初识装饰器)