python高階特性(裝飾器)

2021-09-24 02:59:36 字數 2358 閱讀 7304

裝飾器本質上是乙個函式,該函式用來處理其他函式,它可以讓其他函式在不需要修改**的

前提下增加額外的功能,裝飾器的返回值也是乙個函式物件。它經常用於有切面需求的場景,

比如:插入日誌、效能測試、事務處理、快取、許可權校驗等應用場景。

首先我們先了解以下通用裝飾器的框架,幫助我們更好地理解裝飾器的用法

def log(func):        ##接收乙個函式作為引數,傳入的實參就是被裝飾的函式

print('函式%s被呼叫了' % func.__name__) #為被呼叫的函式新增額外的功能

return func(*args,**kwargs) #呼叫被裝飾的函式,即返回被裝飾函式的執行結果

@log ##語法糖

def add(sum1,sum2):

print(sum1,sum2)

return sum1+sum2

add(1,2)

在這裡我們寫乙個裝飾器的實際應用的例子:

import time

age = 19

def is_adult(fun):

start_time = time.time #增加時間模組,在執行被修飾的函式的同時列印出程式執行的時間

if age>=18:

fun() #由於被裝飾的函式不傳遞引數,直接列印出print的內容,所以不需要return

else:

print('未成年')

end_time = time.time

@is_adult

def music():

time.sleep(1)

print('正在聽**.....')

@is_adult

def videos():

@is_adult

def game():

print('正在玩遊戲......')

music()

videos()

game()

我們可以用多個裝飾器裝飾同乙個函式,下面我們用乙個例子說明同乙個函式被多個裝飾器裝飾時程式的執行過程:

def is_login(fun):

print("判斷是否登入......")

result = fun(*args, **kwargs)

return result

def is_permission(fun):

print("判斷是否有許可權......")

result = fun(*args, **kwargs)

return result

@is_login

@is_permission

def delete():

return "正在刪除學生資訊"

result = delete()

print(result)

##執行結果為

判斷是否登入......

判斷是否有許可權......

正在刪除學生資訊

程式執行過程:

從執行結果可以看到,程式執行時先執行了裝飾器is_login(fun),然後執行裝飾器is_permission(fun),即先執行上面的裝飾器,再執行下面的裝飾器。

裝飾器裝飾過程:對於多個裝飾器裝飾的函式,我們可以理解為下面的裝飾器先裝飾要被裝飾的函式(例如is_permission先裝飾delete),然後上面的裝飾器再裝飾這個已經裝飾過的整體(即is_login裝飾is_permission裝飾後的整體),如果還有更多的裝飾器,可以理解為不斷迭代裝飾,最後執行的時候從上到下巢狀執行。

如果裝飾器需要傳遞引數, 在原有的裝飾器外面巢狀乙個函式即可。

例如:

def auth(type):

if type=='local':

user = input("user:")

passwd = input("passwd:")

if user == 'root' and passwd == 'westos':

result = fun(*args, **kwargs)

return result

else:

print("使用者名稱/密碼錯誤")

else:

print("暫不支援遠端使用者登入")

@auth(type='remote')

def home():

print("這是主頁")

home()

Python高階特性之裝飾器

裝飾器 定義乙個裝飾函式,函式必須返回乙個閉包 閉包就是執行時所需要的外部變數 函式物件,關於閉包的具體介紹,可參考函式,並且被裝飾的函式會被python自動傳遞給裝飾函式,作為裝飾函式的乙個引數。裝飾器的具體定義 1 把要裝飾的方法作為輸入引數 2 在函式體內可以進行任意的操作 可以想象其中會有很...

python高階裝飾器 Python裝飾器高階

對帶引數的函式進行裝飾 對帶引數的函式進行裝飾,內嵌包裝函式的形參和返回值與原函式相同,裝飾函式返回內嵌包裝函式物件 def deco func def deco a,b print before myfunc called.ret func a,b print after myfunc calle...

32 高階特性之類裝飾器

class test def call self print call me t test t class test object def init self,func 傳入待裝飾的函式func print the instance of test is initializing self.func...