装饰器:
#1 、函数即变量 #2、高阶函数 # 1) 把函数当参数传 # 2)有以函数当返回值 #3、函数的嵌套 #1)是函数里面又以def关键字定义一个函数 #2)注意:如果在函数里面使用另一个函数叫函数调用而不嵌套 #3 、装饰器= 高阶函数+ 嵌套函数 def timer(func):#定义一个嵌套函数 def decorator(*args,**kwargs): # 为了方便所认的函数都能使用该装饰器 所以这里用不定长形参来接收 print(‘装饰开始‘) print(kwargs) func(*args,**kwargs) #真正需要装饰的函数 print(‘装饰结束‘) return decorator #返回函数 @timer #实际就等是 test1 = timer(test1) def test1(): print(‘我是test1‘) test1() @timer #实际等于 test2 = timer(test2) 语法糖 def test2(*args,name,age): print(‘我是test2 args=%s kwargs=%s list=%s‘%(name,age,args)) test1() test2(1,2,13,name=‘xiaoming‘,age=‘18‘)
可以带参数的装饰器 核心就是在外面多加一层函数来接收装饰器带过来的参数
# 在上个版本的基础上增加 装饰器传参 和 被装饰的函数没有返回值问题 name = ‘alex‘ password = ‘abc123‘ #定义一个装饰器 def timer(*timer): #这里的dec是装饰器传过来的参数 print(timer[0]) def out_decrator(func): #func是需要被装饰的函数 def decrator(*args,**kwargs): if timer[0]==‘file‘:#本地验证 inputname = input(‘输入用户名:‘) inputpass = input(‘请输入密码:‘) if inputname == name and inputpass == password : print(‘开始装饰‘) print(args ,kwargs) re = func(*args,**kwargs) #如果被装饰的函数返回值用一个变量来接收 return re print(‘结束装饰‘) else: exit(‘用户名或密码错误 ‘) elif args[0]==‘ldap‘: print(‘需要网络验证‘) else: print(‘不带参数的装饰器‘) return decrator return out_decrator @timer(‘loca‘) def index(): print(‘this is index ‘) @timer(‘file‘) def home(a): print(‘thist is home‘,a) return 1 home(‘a‘)