*****
知道京東吧(不知道?那你知道**,蘑菇街吧)
我們身為使用者,在進入介面的時候
首先會提示我們登陸是吧
當我們登陸的時候,接下來的所有操作就不用再驗證身份了
否則,一到收藏啊,關注啊,就需要我們重新登陸
那我們可不可以做乙個這個呢??
沒有資料庫,我們模擬乙個資料庫,懂我意思吧!
db =
def login():
if db["login"] == false:
usr = input("請輸入使用者名稱:")
psd = input("請輸入密碼:")
if usr == "poddy" and psd == "123546":
print("登陸成功!")
db["login"] = true
else:
print("登入失敗!")
login()
def meizhuang():
login(meizhuang)
print("美妝專區")
def qinzi():
login(qinzi)
print("親子專區")
def dianzi():
login()
print("電子專區")
dianzi()
這樣,就完成了需求了
但是!!!!!!!!!!!!!!!!!!!!!!!
你改變了原來的寫好的函式模組,你把每個模組都加上了login()函式
這樣是不符合「開放-封閉」原則的(第乙個原則!)
就是我現在實現的**塊(def裡麵包著的)你不能給我動
但是你可以給我加功能!
那就想到了函式的巢狀,將上乙個函式當作引數傳過來就完事了唄!
想的很好!於是高階版來了!
db =
def login(func):
if db["login"] == false:
usr = input("請輸入使用者名稱:")
psd = input("請輸入密碼:")
if usr == "poddy" and psd == "123546":
print("登陸成功!")
db["login"] = true
func()
else:
print("登入失敗!")
login(func)
# if db["login"] == true:
# func()
def meizhuang():
print("美妝專區")
def qinzi():
print("親子專區")
def dianzi():
print("電子專區")
login(dianzi)
okok,大功告成!
但是,還不行!!!!!!!!!!!!!!!!!!!!!!!!
你想想熬,你寫的是函式是吧
原先呼叫函式是介個亞子
dianzi()
現在呼叫呢?就變成了這個亞子
login(dianzi)
乙個人兩個人好說,啊,改變一下呼叫方法
那要是很多人呢?你確定你還能活著出去?
呼叫方法也不能變!**塊也不能變!那要怎麼做呢?
記得在匿名函式那提過,給匿名函式取名然後呼叫的問題
匿名函式不是函式嘛?那就是說明函式也是可以被命名的
這麼解釋有問題嗎?
那我們是不是可以這麼考慮
dianzi = login(dianzi)
dianzi()
執行一下,報錯了!
為啥呢?仔細看一下,在執行 login(diazi) 的時候,按照**邏輯,最後執行的是dianzi()
現在你將 login(diazi) 重新命名為 dianzi , 然後執行dianzi()
那不就相當於你執行了 login(diazi)() 四捨五入最後你執行的就是 dianzi()()
dianzi()()??? 你見過這玩仍????
*十分重要*
*值得深究*
python基礎 (六) 裝飾器
裝飾器即函式,裝飾就是修飾,為其他函式新增新功能。1.不修改被裝飾函式的源 開放封閉原則 2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式 裝飾器 高階函式 函式巢狀 閉包 1.函式接收的引數是乙個函式名 2.函式返回值是乙個函式名 3.滿足上述條件任意乙個,都可稱之為高階函式 高階函式示例...
Python基礎(六) 裝飾器
def foo print 我的函式名作為引數傳給高階函式 def gao jie1 func print 我就是高階函式1,我接收的引數名是 s func func def gao jie2 func print 我就是高階函式2,我的返回值是 s func return func gao jie...
Python基礎學習 函式裝飾器
裝飾器是python中非常實用的函式表達法,盡頭我們不講裝飾器原理,只講怎麼應用。裝飾器原理涉及物件導向以及函式本身也可以作為乙個引數被傳遞,原理比較簡單,但由於迴圈巢狀初學者難以理解。既然難以理解,那就先學會怎麼用,有了經驗,理解起來就相對容易了。首先我們要明白,裝飾器內函式是先於被裝飾函式執行的...