0515Python基础-带参数的装饰器-多个装饰器
1、函数的有用信息。
def login(username, password):
"""
此函数需要用户名,密码两个参数,完成的是登录的功能。
:return: True 登录成功。 False登录失败。
"""
# print(login.__name__)
# print(login.__doc__)
print('登录成功...')
return True
print(login.__name__)
print(login.__doc__)
def wrapper(f):
def inner(*args, **kwargs):
print(f.__name__)
print(f.__doc__)
"""执行函数之前的操作"""
ret = f(*args, **kwargs)
"""执行函数之后的操作"""
return ret
return inner
@wrapper
def login(username, password):
"""
此函数需要用户名,密码两个参数,完成的是登录的功能。
:return: True 登录成功。 False登录失败。
"""
print('登录成功...')
return True
# print(login.__name__)
# print(login.__doc__)
login(1, 2)
from functools import wraps
def wrapper(f):
@wraps(f)
def inner(*args, **kwargs):
"""执行函数之前的操作"""
ret = f(*args, **kwargs)
"""执行函数之后的操作"""
return ret
return inner
@wrapper
def login(username, password):
"""
此函数需要用户名,密码两个参数,完成的是登录的功能。
:return: True 登录成功。 False登录失败。
"""
a = 2
c = 4
print('登录成功...')
return True
print(login.__name__)
print(login.__doc__)
for i in login.__dict__:
print(i)
print(dir(login))
2、带参数的装饰器
import time
def timer_out(flag1): #falg1 = flag
def timer(f):
def inner(*args, **kwargs):
if flag1:
start_time = time.time()
time.sleep(0.3)
ret = f(*args, **kwargs)
end_time = time.time()
print('执行效率%s' % (end_time-start_time))
return ret
else:
ret = f(*args, **kwargs)
return ret
return inner
return timer
flag = False
@timer_out(flag) # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer
def func1():
print(111)
@timer_out(flag)
def func2():
print(222)
@timer_out(flag)
def func3():
print(333)
func1()
func2()
func3()
count = 1
def func4():
count = count + 1
print(count)
func4()
局部只能引用全局的变量,不能修改,如果要修改,global。
def func4():
count = 3
def inner():
nonlocal count
count = count + 1
print(count)
func4()
子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal。
3、多个装饰器装饰一个函数。
def wrapper1(func): # func = f函数名
def inner1():
print('wrapper1 ,before func') # 2
func()
print('wrapper1 ,after func') # 4
return inner1
def wrapper2(func): # func = inner1
def inner2():
print('wrapper2 ,before func') # 1
func() # inner1()
print('wrapper2 ,after func') # 5
return inner2
@wrapper2 # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2
@wrapper1 # f = wrapper1(f) 里面的f函数名 外面的f新变量=inner1
def f():
print('in f') # 3
f() # inner2()
'''
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func
'''