函式基礎(六) 裝飾器

2022-05-17 02:32:51 字數 2152 閱讀 3850

*****

知道京東吧(不知道?那你知道**,蘑菇街吧)

我們身為使用者,在進入介面的時候

首先會提示我們登陸是吧

當我們登陸的時候,接下來的所有操作就不用再驗證身份了

否則,一到收藏啊,關注啊,就需要我們重新登陸

那我們可不可以做乙個這個呢??

沒有資料庫,我們模擬乙個資料庫,懂我意思吧!

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中非常實用的函式表達法,盡頭我們不講裝飾器原理,只講怎麼應用。裝飾器原理涉及物件導向以及函式本身也可以作為乙個引數被傳遞,原理比較簡單,但由於迴圈巢狀初學者難以理解。既然難以理解,那就先學會怎麼用,有了經驗,理解起來就相對容易了。首先我們要明白,裝飾器內函式是先於被裝飾函式執行的...