python-装饰器

如果在函数f1上方使用了“@+装饰器函数名”(以上图为例),当在程序中调用f1()时,执行过程如下:
1》执行outer函数
2》将f1赋值给func
此时的func()相当于:
print("F1")
3》将inner赋值给f1
4》执行inner函数,即为
print("before")
print("F1")
print("after")
带参数的函数加装饰器的书写方式:

有多个参数的函数加装饰器的写法(所有函数都可以应用此类装饰器):

装饰器应用实例--用户管理程序
LOGIN_USER = {"is_login":False}
def outer(func):
def inner(*args):
if LOGIN_USER['is_login']:
r = func()
return r
else:
print("请登录")
return inner
@outer
def order():
print("欢迎%s登录"%LOGIN_USER['current_user'])
@outer
def changepwd():
print("欢迎%s登录"%LOGIN_USER['current_user'])
@outer
def manager():
print("欢迎%s登录"%LOGIN_USER['current_user'])
"""
#不用装饰器的写法
def order():
if LOGIN_USER['is_login']:
print("欢迎%s登录"%(LOGIN_USER['current_user']))
else:
print("请登录")
def changepwd():
if LOGIN_USER['is_login']:
print("欢迎%s登录"%(LOGIN_USER['current_user']))
else:
print("请登录")
def manager():
if LOGIN_USER['is_login']:
print("欢迎%s登录"%(LOGIN_USER['current_user']))
else:
print("请登录")
"""
def login(username, pwd):
if username == "alex" and pwd == "123":
LOGIN_USER['is_login'] = True
LOGIN_USER['current_user'] = username
manager()
def main():
while True:
inp = input("1,后台管理;2,登录")
if inp == '1':
manager()
elif inp == '2':
username = input("请输入用户名")
pwd = input("请输入密码")
login(username, pwd)
main()


浙公网安备 33010602011771号