函式 裝飾器

2022-06-29 11:06:10 字數 4192 閱讀 2800

一.裝飾器。

裝飾器: 在目標函式前和後插入一段新的**,不改變原來的**.裝飾器是對原來基礎功能的擴充套件和開放,又不變動原**,所以比較安全.

裝飾器的本質是乙個閉包。什麼是閉包,就是內層函式對外層函式的變數的引用。

裝飾器語法

#

通用裝飾器寫法:

#python裡面的動態**.

#存在的意義: 在不破壞原有函式和原有函式呼叫的基礎上. 給函式新增新的功能

fn是目標函式.

def inner(*args, **kwargs): #

為了目標函式的傳參

'''在執行目標函式之前.....

'''ret = fn(*args, **kwargs) #

呼叫目標函式, ret是目標函式的返回值

'''在執行目標函式之後....

'''return ret #

把目標函式返回值返回. 保證函式正常的結束

return

inner

#def

target_func():

pass

#target_func() #

此時執行的是inner

def

outer(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")

print

(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")

print

(a)列印結果為:

對不起,您還沒登陸.

請輸入賬號:alex

請輸入密碼:123裝飾器把你裝飾了一番,你nb了

玩家 alex 進入了遊戲('

得到月之光芒劍

', '

從此人生達到巔峰!

')

多個裝飾器裝飾同乙個函式:

def

def 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.不帶引數裝飾器 此方式...