闭包与装饰器
我的这篇博客将闭包与装饰器与装饰器的实现过程讲述的非常明白了:
装饰器的实际应用
说白了,装饰器其实就是在我们想执行的函数的之前与之后做一些事情。
下面这篇博客中的技术点使用到了装饰器:
计算程序执行的时间
import time
def counter(func):
#注意里面必须有*args
def inner(*args):
start = time.time()
#注意这里必须有*args,因为下面的swap函数有2个参数
func(*args)
stop = time.time()
s = '函数 %s 执行时间:%s'%(func.__name__,(stop-start))
print(s)
return inner
@counter
def swap(x,y):
time.sleep(2)
x,y = y,x
print(x,y)
if __name__ == '__main__':
counter(swap(11,22))
给函数加上简单的认证逻辑
'''# 利用不带参数的装饰器 进行登陆认证的小练习'''
def outer(func):
def wrapper(*args,**kwargs):
username = input('用户名:').strip()
password = input('密码:').strip()
if username == 'whw' and password == '123':
print('登陆成功!')
#登陆成功才能执行func1
ret = func()
return ret
else:
print('用户名或者密码错误!')
return wrapper
@outer # func1 = outer(func1)
def func1():
print('do something...')
if __name__ == '__main__':
func1()
'''# 带参数的装饰器 —— 认证成功后不用再认证'''
login_status = {'name':None,'pwd':False}
def auth(auth_type='file'):
def outer(func):
def wrapper(*args,**kwargs):
#说明已经进行过认证了,直接运行函数就ok
if login_status['name'] and login_status['pwd']:
return func(*args,**kwargs)
#满足认证的参数进行认证:
if auth_type == 'file':
print(login_status)
with open('user_message','r',encoding='utf8')as f:
dic_data = eval(f.read())
username = input('用户名:').strip()
password = input('密码:').strip()
if username == dic_data['name'] and password == dic_data['password']:
#修改login_status的值
login_status['name'] = username
login_status['pwd'] = password
#执行func函数
func(*args,**kwargs)
else:
print('用户名或者密码错误!')
else:
print('非法函数!无权进行认证!')
return wrapper
return outer
@auth(auth_type='file')
def func1():
print('111')
@auth(auth_type='file')
def func2():
print(222)
@auth(auth_type='file')
def func3():
print(333)
if __name__ == '__main__':
func1()
func2()
func3()
利用闭包计算不同分制下的成绩通过情况
### 利用闭包计算不同分制下的成绩通过情况
def score_pass(score_level):
def compare(score):
if score >= score_level:
print('passed!')
else:
print('failed!')
return compare
if __name__ == '__main__':
#100分制 60分及格
score_100 = score_pass(60)
#120分制,70分及格
score_120 = score_pass(70)
#相同的分数在不同分制下通过情况不一样!
score_100(60)#passed!
score_120(60)#failed!