1、整理装饰器的形成过程,背诵装饰器的固定格式
固定格式
def wrapper(func): 2.传入函数值f
def inner(*args, **kwargs):
#执行函数前进行的操作
ret = func(*args,**kwargs) # 5.执行f()函数
#执行函数后进行的操作
return ret # 6.返回一个值给函数调用者 inner函数名的id
return inner # 4.通过return把返回值给函数调用者 此时f = inner
@wrapper # 1.f = wrapper(f)执行wrapper函数
def f():
print(666)
f() 3.执行inner函数 f() = inner()
注意:return用法
1.函数遇到return时函数体结束
2.如果return后面跟上函数名则返回函数名在内存中的id
3.如果return后面跟上其他字符则返回其本身
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码
def func1(f):
def inner():
print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
f()
return inner
@func1
def func2():
print('hello world')
func2()
3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码
def func1(f):
def inner():
f()
print('每次执行被装饰函数之后都得先经过这里,这里根据需求添加代码')
return inner
@func1
def func2():
print('hello world')
func2()
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
def func2(f):
def innter():
a = 1
while a <= 3:
username = input('请输入用户名')
password = input('请输入密码')
if username == 'jinyuan' and password == '123':
f()
break
else:
print('账号密码错误你还有{}次机会'.format(3-a))
a += 1
continue
return innter
@func2
def func1():
print('登录成功')
func1()
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),
要求登录成功一次,后续的函数都无需再输入用户名和密码
dic = {
'name':None,
'status' : False
}
def func1(f):
def inner(*args,**kwargs):
num = 0
while num < 3:
if dic['status']:
ret = f(*args,**kwargs)
return ret
else:
username = input('请输入用户名')
password = input('请输入密码')
f1 = open('test.txt',encoding='utf-8')
for i in f1:
new_list = i.strip().split()
if username == new_list[0] and password == new_list[1]:
dic['status'] = True
break
else:
num += 1
print('输入用户名或密码错误还有{}次机会'.format(3-num))
continue
return inner
@func1
def func4():
print('登录成功')
func4()
6,给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
import time
def wapper(f):
def inner(*args,**kwargs):
struct_time = time.localtime()
time_log = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
f1 = open('log1.txt',encoding='utf-8',mode='a')
f1.write(time_log+' ')
f1.write(str(f)+'
')
f(*args,**kwargs)
return inner
@wapper
def func1(*args,**kwargs):
print('hello world')
func1('aa','bbb')