Python笔记之三默认装饰器(decorator)的执行过程详解

     如果我们每需要扩展一个新功能,就需要去定义一个新功能函数,和定义一个装饰器,不修改原有代码的基础,我们觉得这样也有些麻烦,能不能我定义好一个默认的装饰器,以后有新的函数功能需求,我都默认只用这个一个装饰器,而我只需要去定义新的功能函数就可以了,是不是相比之前我们代码更简洁了。这就是我们今天要讲的可以给装饰器传递函数。或者说去定义一个默认的装饰器。

还是看这个例子

def login(func):

    def inner():

        print("Verify")

        return func

    return inner

@login

def show():

    res = print("Show Page")

    return res

show()

@ login 这是个python 的中的语法 糖,他包含2层意思

第一层:先执行login(),且把它包装的函数show对象作为参数,重新赋值给新的show ,也即使show=login(show)

我们知道login(show)执行的结果是return inner ,所以 新show = inner

第二层: 因为从新定义了show ,所以后面的代码show(),其实它是新的show 了,show(),已经变成了新show()函数的执行

而新show=inner,所以show()= inner(),

所以第二层意思:

inner(),执行,返回的func() ,func 代表的是老的show,所以show() 正式执行他show函数代码块里的内容。

新show=login(老show) 这个过程,是python 自己给你封装定义好了。

如果我自己定义函数,作为装饰器参数呢?

接下来看看默认装饰的框架,默认装饰器就是在装饰器上面再加固一层,加入我还是用web登录的例子,我想在login 登录前加一个账号给验证,在登录之后,做一个提示,表示你登录成功,可以做什么........

def before_fun():

    res = print("befor")

    return res

def after_fun():

    res = print("after")

 

def makerlogin(before_fun,after_fun):

    def login(func):

        def inner(*args,**kwargs):

            if func() == None:  # 如果登录页面返回的是None,表示成功登录了

                return before_fun()  #执行before()

            else:

                return after_fun()  # 返回消息,表示登录失败

        return inner

    return login

@makerlogin(before_fun,after_fun)

def show(name):

    res = print("show page")

    return res

 

show("lily")

@makerlogin(before_fun,after_fun)包含三层意思

1 执行makerlogin(before_fun,after_fun)

2 @login ,执行login(show),执行login(),且将包装的函数show 对象作为参数

3 新show=login(老show),将login(show) 执行的结果返回值赋值给新show

 

posted @ 2016-11-22 09:31  xierliu_lwh  阅读(376)  评论(0编辑  收藏  举报