一.裝飾器。
裝飾器: 在目標函式前和後插入一段新的**,不改變原來的**.裝飾器是對原來基礎功能的擴充套件和開放,又不變動原**,所以比較安全.
裝飾器的本質是乙個閉包。什麼是閉包,就是內層函式對外層函式的變數的引用。
裝飾器語法
#通用裝飾器寫法:
#python裡面的動態**.
#存在的意義: 在不破壞原有函式和原有函式呼叫的基礎上. 給函式新增新的功能
fn是目標函式.
def inner(*args, **kwargs): #
為了目標函式的傳參
'''在執行目標函式之前.....
'''ret = fn(*args, **kwargs) #
呼叫目標函式, ret是目標函式的返回值
'''在執行目標函式之後....
'''return ret #
把目標函式返回值返回. 保證函式正常的結束
return
inner
#def
target_func():
pass
#target_func() #
此時執行的是inner
defouter(a):
b = 1
definner():
print(a +b)
return
inner
# 外函式結束的時候發現內部函式將會用到自己的臨時變數,這兩個臨時變數就不會釋放,會繫結給這個內部函式
if__name__ == '
__main__':
inner = outer(1) inner()
下面是簡易版裝飾器defplay(username, password):
print("
雙擊lol")
print("登入"
, username, password)
print("
選擇狂戰士")
print("
進草叢"
)
return
"月之光芒
"def
xiaoxiaole(qq):
print("
登入qq賬號")
print("
消消樂"
)fn = play
def inner(*args, **kwargs): #
無敵傳參 接受到的是元組 ("alex", 123)
print("開掛"
) ret = fn(*args, **kwargs) #
接受到的所有引數. 打散傳遞給正常的引數
return
ret 接收函式的返回值
return
inner
play = inner
ret = play('
alex
',"123")
(ret)
輸出結果:
開掛雙擊lol
登入 alex 123選擇狂戰士
進草叢月之光芒
帶引數的裝飾器(裝飾器的開關).
裝飾器本身的引數
目標函式
def inner(*args, **kwargs): #
目標函式執行需要的引數
if flag ==true: #如果開關為false,就不進行函式的裝飾
print("
問問金老闆. **怎麼樣啊
") #執行函式之前
ret = fn(*args, **kwargs) #
在執行函式本身
print("
金老闆騙我. 恨你
") #執行函式之後
return
ret
else
: ret = fn(*args, **kwargs) #執行函式本身
return
ret
return
inner
return
#語法糖 @裝飾器
def yue(): #
print("
走啊. 約不?")
yue()
解釋1:不理解為何會變?:
寫完乙個函式之後,不指定物件的呼叫它,你print這個函式,列印出來的內容,除了函式裡的,一定還有它自己的返回值,說白了,此時的呼叫完之後,函式已經變成了它自己的返回值
解釋2:
裝飾器的應用:
#裝飾器在登陸驗證方面的應用.
flag =false #
沒登陸的狀態為false
def login(): #
此函式為登陸函式,只有登陸成功,才會顯示成功登陸的狀態(flag = true)
global
flag
zhanghao =input("
請輸入賬號:")
mima = input("
請輸入密碼:")
if zhanghao=="
alex
"and mima=="
123"
: flag =true
return
"登陸成功
"else
:
print("
對不起,輸入有誤.")
exit()
defzhuangshi1(a):
def zhuangshi(fn): #
裝飾器函式
def inner(*can1,**can2):
while 1:
if flag ==true:
print("
裝飾器把你裝飾了一番,你nb了")
ret = fn(*can1,**can2)
return ret,"
從此人生達到巔峰!"#
此處有多個返回值,會變成元組形式返回
else
:
print("
對不起,您還沒登陸.")
login()
return
inner
return
zhuangshi
@zhuangshi1(true)
defwangzhe(a,b):
print("
玩家",a,"
進入了遊戲")
return
"得到月之光芒劍
"a = wangzhe("
alex
","123456")
(a)列印結果為:
對不起,您還沒登陸.
請輸入賬號:alex
請輸入密碼:123裝飾器把你裝飾了一番,你nb了
玩家 alex 進入了遊戲('
得到月之光芒劍
', '
從此人生達到巔峰!
')
多個裝飾器裝飾同乙個函式:
defdef inner(*args, **kwargs):
print("
裝飾1111111")
ret = fn(*args, **kwargs)
print("
裝飾1111111")
return
ret
return
inner
def
def inner(*args, **kwargs):
print("
裝飾2222222")
ret = fn(*args, **kwargs)
print("
裝飾2222222")
return
ret
return
inner
#就近原則
deffunc():
print("
我是幸運的func")
func()
輸出結果為:
裝飾1111111
裝飾2222222
我是幸運的func
裝飾2222222
裝飾1111111
函式裝飾器 類裝飾器
一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...
python裝飾器 函式裝飾器,類裝飾器
只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...
python 裝飾器 函式裝飾器 類裝飾器
python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...