老王:算了,估計你也想不出來。。。學過嵌套函數沒有?
你: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("----歐美專區----")
?