抱歉,自己的拖延症导致好久都没补之前落下的...让我忏悔一会~~
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 rreturn innerdef outer2(func):def inner(*args,**kwargs):if LOGIN_INFO['is_login']:r=func()return relse: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 LeeUserInfo={}
UserInfo['is_login']=True
UserInfo['user_type']=2def checktype(func):def inner():if UserInfo.get('user_type',None) == 2:ret = func()return retelse:print('you cannot checkinfo')return innerdef checklogin(func):def inner():if UserInfo.get('is_login',None) == True:ret = func()return retelse: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()