如果在函数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()