装饰器
无参装饰器
装饰器
import time
def timmer(func):
def wrapper(*args, **keargs):
start = time.time()
res = index
stop = time.time()
print('run time is %f' % (stop - start))
return wrapper
@timmer # 装饰器 index = timmel(index)
def index():
time.sleep(3) # 把函数运行时间延长三秒
print('welconme!')
index() # timmer(index()) 个人理解
import time
def timmer(func): # 闭包函数
def wrapper():
print(func)
start_time=time.time()
func()
stop_time=time.time()
print('run time is %f'%(stop_time-start_time))
return wrapper
@timmer # 装饰语法
def index(): # 被装饰对象
time.sleep(3)
print('welcome!')
index()
#上面的运行结果
<function index at 0x10217b9d8>
welcome!
run time is 3.000330
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs)
stop_time=time.time()
print('tun time is %f'% (stop_time-start_time))
return wrapper
@timmer
def home(name):
time.sleep(2)
print("welconme to %s!"% name)
@timmer
def auth(name,passwd):
print(name,passwd)
@timmer
def tell():
print('-'*20)
home('egon')
auth('alex','123')
tell()
#上面运行结果
welconme to egon!
tun time is 2.002392
alex 123
tun time is 0.000015
--------------------
tun time is 0.000007
import time
def timmer(func): #计算函数运行时间
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #func(*args,**kwargs) 如果不赋值,最终打印出来的结果会出现None
stop_time=time.time()
print('tun time is %f'% (stop_time-start_time))
return res # 要是用到返回值,装饰器也和被装饰的函数一样需要返回值 return
return wrapper
@timmer
def my_max(x,y): #返回最大值
print('from to my_max')
res=x if x>y else y
return res
print(my_max(2,3))
有参装装饰器
def auth2(auth_type):
def auth(func):
def wrapper(*args,**kwargs):
if auth_type == 'file':
name=input("username: ")
passwd=input("password: ")
if name == 'name' and passwd=='123':
print('auth successfull')
res=func(*args,**kwargs)
return res
else:
print("auth error")
elif auth_type=='sql':
print('还不会')
return wrapper
return auth
@auth2( auth_type = 'sql' ) # auth index = auth (index)
def index():
print('welcome to index.')
index()
多层装饰器
# 无参
@ccc
@bbb
@aaa
def func():
pass
func=aaa(func)
func=bbb(aaa(func))
func=ccc(bbb(aaa(func)))
# 有参
@ccc('c')
@bbb('b')
@aaa('a')
def func():
pass
# @aaa('a')
func=aaa('a')(func)
# @bbb('b')
func=bbb('b')(aaa('a')(func))
# @ccc('c')
func=ccc('c')(bbb('b')(aaa('a')(func)))
重复认证
courent_login={'name':None,'login':False} # 登录状态
def auth2(auth_type='file'): # 加了默认参数
def auth(func):
def wrapper(*args,**kwargs):
if courent_login['name'] and courent_login['login']: # 判断是否登录
res=func(*args,**kwargs)
return res # 已登录直接返回数据
if auth_type == 'file':
name=input("username: ")
passwd=input("password: ")
if name == 'name' and passwd=='123':
print('auth successfull')
res=func(*args,**kwargs)
courent_login['name']=name # 把登录的用户添加到登录状态里面
courent_login['login']=True # 把当前用户登录状态添加到courent_login
return res
else:
print("auth error")
elif auth_type=='sql':
print('还不会')
return wrapper
return auth
# 定义阶段
@auth2( auth_type = 'file' ) # auth index = auth (index)
def index():
print('welcome to index.')
@auth2()
def home():
print("from to index")
# 调用阶段
index()
home()
作业
1
import time
def timmer(func):
def wrapper(*args, **kwargs):
start = time.time()
func(*args,**kwargs)
stop = time.time()
print('run time is %f' % (stop - start))
return wrapper
# 装饰器 index = timmel(index)
@timmer
def index(): # 无参函数
time.sleep(3) # 把函数运行时间延长三秒
print('welconme!')
@timmer
def auth(name,passwd): # 有参函数 两个参数
print(name,passwd)
@timmer
def home(name): # 有参函数 一个参数
print(name)
index()
auth("egon",'passwd')
home('name')
2
以装饰器来3次登录,不更改源代码的情况下,增加计算函数运行时间
import os,time
tag = True
usr_dict = {}
courent_login={'name':None,'login':False} # 避免重复登录
# 计算函数运行时间
def timmer(func):
def wrapper(*args, **kwargs):
start = time.time()
func(*args,**kwargs)
stop = time.time()
print('run time is %f' % (stop - start))
return wrapper
def auth2(auth_type='file'): # 加了默认参数auth_type='file'
def auth(func):
def wrapper(*args,**kwargs):
if courent_login['name'] and courent_login['login']:
res=func(*args,**kwargs)
return res
if auth_type == 'file':
with open("usr.conf", encoding="utf8") as usr_file, open("usr1.conf", encoding="utf8", mode="w") as usr1_file:
usr_name = usr_file.read()
usr_dict = eval(usr_name)
count = 0
tag = True
while tag:
usrname = input("\t输入'q',退出\nplease username:").strip()
if usrname in usr_dict.keys() :
passwd = input("please password:").strip()
if int(usr_dict[usrname][1]) < 3 and count < 5:
if passwd == usr_dict[usrname][0]:
res=func(*args,**kwargs)
courent_login['name']=usrname
courent_login['login']=True
return res
else:
usr_dict[usrname][1] = int(usr_dict[usrname][1]) + 1
print("username or password is wrong")
usr = str(usr_dict)
usr1_file.write(usr)
usr1_file.flush()
os.rename("usr.conf", "usr2.conf")
os.rename("usr1.conf", "usr.conf")
else:
print("User is locked")
continue
elif usrname == 'q':
print(usr_dict)
usr=str(usr_dict)
usr1_file.write(usr)
usr1_file.flush()
os.rename("usr.conf", "usr2.conf")
os.rename("usr1.conf", "usr.conf")
break
else:
if usrname != usr_dict.keys():
count += 1
print("not username")
elif auth_type=='sql':
print("还不会")
return wrapper
return auth
@timmer
@auth2(auth_type='file')
def index():
print("welcome!")
@timmer
@auth2()
def home():
print("from to home")
index()
home()
来源:http://www.cnblogs.com/hyhnm/p/6691379.html