老王:算了,估计你也想不出来。。。学过嵌套函数没有?
你:yes,然后呢?
老王:想实现一开始你写的america = login(america)不触发你函数的执行,只需要在这个login里面再定义一层函数,第一次调用america = login(america) 用到外层login ,这个login虽然会执行,但不会触发认证了,因为认证的所有代码被封装在login里层的新定义的函数里了,login只返回里层函数的内存地址,再执行america()时,就会调用里层函数拉。。。
你:。。。。。。什么? 什么个意思,我懵逼了。。。
老王:还是给你看代码吧。。
# -*-coding:utf-8-*-
user_status = Fales #用户登录了就把这个改成True
def login(func):
def inner():
_username = "alex" #假装这是DB里存的用户信息
_password = "abc!23" #假装这是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()
return inner
def home():
print("----首页----")
def america():
login() #执行前加上验证
print("----欧美专区----")
def japan():
print("----日韩专区----")
def henan():
login() #执行前加上验证
print("----河南专区----")
henan = login(henan)
print(henan)
执行结果:
<function login.<locals>.inner at 0x101ea10d0>
此时你仔细着了老王写的代码,感觉老王真不是一般人呀,连这种奇淫巧技都能想出来。。。,心中默默感谢上天赐你一个大牛邻居。
你:老王呀,你这个姿势很nb呀,你独创的?
此时你媳妇噗呲笑出声来,你也不知道她笑个球。。。
老王:呵呵,这不是我独创的呀当然,这是开发中一个常用的玩法,叫语法糖,官方名称“装饰器”,其实上面的写法,还可以更简单可以把下面代码去掉。
america = login(america) #你在这里相当于把america这个函数替换了
只在你要装饰的函数上面加上下面代码:
@login
def america():
#login() #执行前面加上验证
print("----欧美专区----")
原文:https://www.cnblogs.com/kingforn/p/10916789.html