def outer(func): def inner(): print(‘before‘) func() print(‘after‘) return inner @outer def f1(): print(‘f1‘)
功能:
1.自动执行outer()函数,并把outer函数下面的函数名作为参数传递给outer函数
2.将outer函数的返回值重新赋值给f1
以上代码执行过后:
1.f1不在指向原来的f1函数,而是执行inner函数
2.func执指向原来的f1函数
也就是说函数被装饰器装饰之后,被装饰的函数名引用指向装饰器函数的内层函数即inner()
def outer(func): def inner(): print(‘before‘) ret = func() # 接收原来f1函数的返回值 print(‘after‘) return ret # 将函数之返回 return inner @outer def f1(): return ‘f1‘ f1()
def outer(func): def inner(a,b): # 加参数 print(‘before‘) ret = func(a,b) # 加参数 print(‘after‘) return ret # 将函数之返回 return inner @outer def f1(a, b): return a + b f1(1,2)
def outer(func): def inner(*args,**kwargs): # 加参数 print(‘before‘) ret = func(*args,**kwargs) # 加参数 print(‘after‘) return ret # 将函数之返回 return inner @outer def f1(a, b): return a + b f1(1,2)
UserInfo = {‘name‘: ‘alex‘, ‘age‘: 18, ‘sex‘: ‘男‘}
Login_flag = False
Login_type = None
# 用户登陆查询用户信息,查看信息之前先登陆,进行后台管理,必须是管理员
def check_login(func):
def inner(*args,**kwargs):
if Login_flag is True:
func()
else:
print(‘请先登陆...‘)
return inner
def check_type(func):
def inner(*args,**kwargs):
if Login_type == 1:
func()
else:
print(‘无权限‘)
return inner
def login(name, pwd):
global Login_flag, Login_type
if name == ‘admin‘:
Login_flag = True
Login_type = 1
elif name == ‘alex‘ and pwd == ‘123‘:
Login_flag = True
else:
pass
@check_login
def select():
for li in UserInfo.keys():
print(UserInfo[li])
@check_login
@check_type
def admin():
print(‘后台管理‘)
inp = input(‘1:登陆 2:查看用户,3:后台管理\n>>>‘)
name = input(‘UserName:>>>‘)
pwd = input(‘PassWord:>>>‘)
if inp == ‘1‘:
login(name, pwd)
elif inp == ‘2‘:
select()
elif inp == ‘3‘:
# login(name, pwd)
login(name, pwd)
admin()
原文:http://www.cnblogs.com/liyqiang/p/6285850.html