函数-函数进阶-装饰器流程分析
老王:算了,估計(jì)你也想不出來。。。學(xué)過嵌套函數(shù)沒有?
你:yes,然后呢?
老王:想實(shí)現(xiàn)一開始你寫的america = login(america)不觸發(fā)你函數(shù)的執(zhí)行,只需要在這個(gè)login里面再定義一層函數(shù),第一次調(diào)用america = login(america) 用到外層login ,這個(gè)login雖然會(huì)執(zhí)行,但不會(huì)觸發(fā)認(rèn)證了,因?yàn)檎J(rèn)證的所有代碼被封裝在login里層的新定義的函數(shù)里了,login只返回里層函數(shù)的內(nèi)存地址,再執(zhí)行america()時(shí),就會(huì)調(diào)用里層函數(shù)拉。。。
你:。。。。。。什么? 什么個(gè)意思,我懵逼了。。。
老王:還是給你看代碼吧。。
# -*-coding:utf-8-*-
user_status = Fales #用戶登錄了就把這個(gè)改成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("用戶已登陸,驗(yàn)證通過。。。")
if user_status:
func()
return inner
def home():
print("----首頁(yè)----")
def america():
login() #執(zhí)行前加上驗(yàn)證
print("----歐美專區(qū)----")
def japan():
print("----日韓專區(qū)----")
def henan():
login() #執(zhí)行前加上驗(yàn)證
print("----河南專區(qū)----")
?
henan = login(henan)
print(henan)
執(zhí)行結(jié)果:
<function login.<locals>.inner at 0x101ea10d0>
此時(shí)你仔細(xì)著了老王寫的代碼,感覺老王真不是一般人呀,連這種奇淫巧技都能想出來。。。,心中默默感謝上天賜你一個(gè)大牛鄰居。
你:老王呀,你這個(gè)姿勢(shì)很nb呀,你獨(dú)創(chuàng)的?
此時(shí)你媳婦噗呲笑出聲來,你也不知道她笑個(gè)球。。。
老王:呵呵,這不是我獨(dú)創(chuàng)的呀當(dāng)然,這是開發(fā)中一個(gè)常用的玩法,叫語(yǔ)法糖,官方名稱“裝飾器”,其實(shí)上面的寫法,還可以更簡(jiǎn)單可以把下面代碼去掉。
america = login(america)? #你在這里相當(dāng)于把a(bǔ)merica這個(gè)函數(shù)替換了
只在你要裝飾的函數(shù)上面加上下面代碼:
@login
def america():
#login()? #執(zhí)行前面加上驗(yàn)證
print("----歐美專區(qū)----")
?
轉(zhuǎn)載于:https://www.cnblogs.com/kingforn/p/10916789.html
總結(jié)
以上是生活随笔為你收集整理的函数-函数进阶-装饰器流程分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 龙卡贷吧信用卡要收年费吗?年费是多少?
- 下一篇: @Component 和 @Bean 的