装饰器又称语法糖,以下代码是装饰器没有简写之前:
# __*__ coding: utf-8 __*__ __author__ = "David.z" user_status = False def login(func): def inner():#嵌套函数 _username = "alex" # 假装这个DB里存的用户信息 _password = "abc123" # 假装这是DB里存的用户密码 global user_status if user_status == False: username = input("user:").strip() password = input("password:").strip() if username == _username and password == _password: print("welcome login...") user_status = True else: print("wrong username or password!") else: print("用户已登录,验证通过。。。") if user_status: func() return inner def home(): print("首页".center(15,"*")) def america(): print("欧美专区".center(15, "*")) def japan(): print("日韩专区".center(15,"*")) def henan(): print("河南专区".center(15,"*")) henan = login(henan) #inner print(henan) #打印出来看看是不是内存地址 henan() #加上()执行函数
以下代码是简写之后:
唯一区别就是在装饰的时候用@login
# __*__ coding: utf-8 __*__ __author__ = "David.z" user_status = False def login(func): def inner():#嵌套函数 _username = "alex" # 假装这个DB里存的用户信息 _password = "abc123" # 假装这是DB里存的用户密码 global user_status if user_status == False: username = input("user:").strip() password = input("password:").strip() if username == _username and password == _password: print("welcome login...") user_status = True else: print("wrong username or password!") else: print("用户已登录,验证通过。。。") if user_status: func() return inner def home(): print("首页".center(15,"*")) def america(): print("欧美专区".center(15, "*")) def japan(): print("日韩专区".center(15,"*")) @login def henan(): print("河南专区".center(15,"*")) # henan = login(henan) #inner # # print(henan) #打印出来看看是不是内存地址 henan() #加上()执行函数
最后一点改变,现在是在调用函数里面加了参数调用,为了不影响其他函数的调用。需要在嵌套的函数里加入*args,**kwargs
# __*__ coding: utf-8 __*__ __author__ = "David.z" user_status = False def login(func): def inner(*args,**kwargs):#嵌套函数 _username = "alex" # 假装这个DB里存的用户信息 _password = "abc123" # 假装这是DB里存的用户密码 global user_status if user_status == False: username = input("user:").strip() password = input("password:").strip() if username == _username and password == _password: print("welcome login...") user_status = True else: print("wrong username or password!") else: print("用户已登录,验证通过。。。") if user_status: func(*args,**kwargs) return inner def home(): print("首页".center(15,"*")) def america(): print("欧美专区".center(15, "*"))
@login def japan(): print("日韩专区".center(15,"*")) @login def henan(style): print("河南专区,--%s".center(15,"*")%style) #henan = login(henan) #inner #japan = login(japan) print(henan) #打印出来看看是不是内存地址 henan("3P") #加上()执行函数 japan()
两层嵌套函数,并带入参数的装饰器:
# __*__ coding: utf-8 __*__ __author__ = "David.z" user_status = False def login(func2): def outer(func): def inner(*args, **kwargs): _username = "alex" # 假装这个DB里存的用户信息 _password = "abc123" # 假装这是DB里存的用户密码 global user_status if user_status == False: username = input("user:").strip() password = input("password:").strip() if username == _username and password == _password: print("welcome login...") user_status = True else: print("wrong username or password!") else: print("用户已登录,验证通过。。。") if user_status: func(*args, **kwargs) return inner return outer def home(): print("首页".center(15,"*")) def america(): print("欧美专区".center(15, "*")) @login("weixin") def japan(): print("日韩专区".center(15,"*")) @login("qq") def henan(style): print("河南专区,---%s".center(15,"*")%style) henan("3P") japan()