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