装饰器原理
原理:
原有函数:
def fun_1()
正常调用原有函数:
fun_1()
现有需要需要在原有函数基础上添加新功能,但是不改变原有函数
法一:
1、添加新函数(装饰一波)
def fun_2(fun_1):
# 嵌套函数。返回函数地址(fun_3 ),调用时才执行
def fun_3():
return fun_3
2、现在调用方式
# 装饰
fun_1 = fun_2(fun_1) # 先执行右边(外函数执行,返回一个内函数地址),再复制给左边(内函数地址)
# 调用
fun_1()
法二:
注解方式
@fun_2
示例(带参数):
user_status = False # 用户登录了就把这个改成True
def login(func): # henan
def inner(*arg, **kwargs):
_username = 'alex' # 假装这是DB里存的用户信息
_password = 'abc!123' # 假装这是DB里存的用户信息
global user_status
if user_status == False:
pass
else:
print("用户已经登录,验证通过")
if user_status:
func(*arg, **kwargs)
return inner
def home():
print('---------首页-----------')
def america():
print('---------欧美专区-----------')
def japan():
print('---------日韩专区-----------')
#@login # henan = login(henan) #inner
def henan(style):
print('---------河南专区-----------', style)
henan = login(henan) # inner
print(henan)
# 调用
henan('3p') # inner()
示例2
user_status = False # 用户登录了就把这个改成True
def login(auth_type): # qq
def outer(func): # henan
def inner(*arg, **kwargs): # 3p
_username = 'alex' # 假装这是DB里存的用户信息
_password = 'abc!123' # 假装这是DB里存的用户信息
global user_status
if user_status == False:
username = input('user:')
password = input('password:')
if username == _username and password == _password:
print('welcome login....')
user_status = True
else:
print('wrong username or password')
else:
print("用户已经登录,验证通过")
if user_status:
func(*arg, **kwargs)
return inner
return outer
#henan = login('qq') # outer
#print(henan)
#r = henan('3p') # inner
#print(r())
xx = login('qq')
print(xx)
henan = xx(henan)
print(henan)
henan('3p')
'''
xx = login('qq')
print(xx)
henan = xx(henan)
print(henan)
<==> @login('qq')
'''