抱歉,自己的拖延症导致好久都没补之前落下的...让我忏悔一会~~
python的装饰器,是为了不破坏已经写好的代码(函数)的封闭性,通过特定的格式,将已完成的函数重新加载,并在外层增加额外的处理,是个很好用的方法,简易代码及说明如下:
#!/usr/bin/env python
# _*_ coding=utf-8 _*_
#将下面需要到的标配统一化管理在代码开头的字典中,是一个比较聪明的做法~~~
LOGIN_INFO = {'is_login':False,
'vip_login':1,
}
def outer(func):
def inner(*args,**kwargs):
print('log')
r=func(*args,**kwargs)
print('after')
return r
#注意此处返回的是一个函数体,而非一个函数,也就是说不是函数执行后的返回值,而是把加工后的inner作为原函数被装饰后的返回
return inner
# 装饰器:@+函数
# 功能:1、自动执行函数outer,并将下面的函数体作为一个参数返回outer
# 2、将outer的返回值重新复制给下面被装饰的函数
@outer
def f1(arg):
print(arg)
return 'hello--------------'
if __name__ == '__main__':
f1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
当然如果需求变多了,也就出现了多层装饰器,简易代码及说明如下:
#!/usr/bin/env python
# _*_ coding=utf-8 _*_
def outer(func):
def inner(*args,**kwargs):
print('log')
r=func(*args,**kwargs)
print('after')
return r
return inner
def outer2(func):
def inner(*args,**kwargs):
if LOGIN_INFO['is_login']:
r=func()
return r
else:
print('please login')
return inner
#如果套两层装饰器,就是双层装饰器了,当然也有三层,四层,道理类似
#这里大家可能有疑惑,python在解释有 “@+函数”这种格式的语法时,会自动从里向外解读,再从外向内执行,
#也就是最里层的原函数被逐层装饰直到最外层,对应例子里,python先把f2(原函数)发给outer2(里层装饰器),被装饰后的outer2的inner再
#被outer(外层装饰器)装饰,最终返回的是outer的inner函数体。
@outer
@outer2
def f2(a,v):
print('F2')
#当然有人问主函数的调用为啥这样写呢,这个会在模块对于的blog中介绍
if __name__ == '__main__':
f2
另外一个小实例
#!/usr/bin/env python
# coding:utf-8
#Author Allen Lee
UserInfo={}
UserInfo['is_login']=True
UserInfo['user_type']=2
def checktype(func):
def inner():
if UserInfo.get('user_type',None) == 2:
ret = func()
return ret
else:
print('you cannot checkinfo')
return inner
def checklogin(func):
def inner():
if UserInfo.get('is_login',None) == True:
ret = func()
return ret
else:
print('please login first')
return inner
#多层装饰器,关键点 编译是从下至上进行的,执行时是从上至下进行。
@checktype
@checklogin
def index():
print('welcome')
a=input('choose:1.userinfo;2.changeotherpasswd;3checkinfo')
if a == '1':
print('c')
if a == '2':
print('b')
if a == '3':
print('a')
index()