溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么應(yīng)用python裝飾器

發(fā)布時間:2021-11-09 11:12:36 來源:億速云 閱讀:245 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“怎么應(yīng)用python裝飾器”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習“怎么應(yīng)用python裝飾器”吧!

什么是裝飾器

從字面意思上來看,裝飾器是用來裝飾其他東西的工具。在python中裝飾器分為函數(shù)裝飾器和類裝飾器。
簡而言之,函數(shù)裝飾器是用來裝飾函數(shù)的裝飾器,其主要目的是增加目標函數(shù)的功能,類裝飾器也就是裝飾類的裝飾器,增加類的功能。

函數(shù)裝飾器

裝飾器本質(zhì)是嵌套函數(shù)
下面是一個簡單的裝飾器

# fun1為裝飾器名稱,function指的是被裝飾的函數(shù)
def fun1(function):
	def fun2():
		print("開始了!")
		function() # 執(zhí)行被裝飾的函數(shù)或者 或者 return function()
	return fun2

外面的fun1()需要傳入一個參數(shù),這個參數(shù)是用來傳入要被裝飾的函數(shù),里面的fun2()需要執(zhí)行function這個參數(shù)。
這是將函數(shù)當成參數(shù)傳入另一個函數(shù)。

使用方法:
在需要裝飾的函數(shù)上添加@裝飾器名稱

@fun1
def fun3():
	print("aaa")

fun3()

可以等價成這樣:

def fun3():
	print("aaa")
fun = fun1(fun3)
fun()

輸出結(jié)果是一致的

執(zhí)行結(jié)果:

開始了!
aaa

如果傳入的函數(shù)需要參數(shù)可以這樣寫:

def fun1(function):
	def fun2(a):
		print("開始了!")
		function(a) 
	return fun2

@fun1
def fun3(a):
	print(a)
fun3("aaa")

輸出結(jié)果:

開始了!
aaa

如果不清楚傳入的函數(shù)需要多少個參數(shù),可以這樣寫:

def fun1(function):
	def fun2(*args, **kwargs):
		print("開始了!")
		function(*args, **kwargs) 
	return fun2

@fun1
def fun3(a,b):
	print(a,b)

@fun1	
def fun4(a,b,c):
    print(a,b,c)
    
fun3("aaa","bbb")
fun4("ccc","ddd","eee")

運行結(jié)果:

開始了!
aaa bbb
開始了!
ccc ddd eee

如果函數(shù)裝飾器需要添加參數(shù),可以這樣寫:

def fun(msg):
	def fun1(function):
		def fun2(*args, **kwargs):
			print("開始了!{}".format(msg))
			function(*args, **kwargs) 
		return fun2
	return fun1

@fun(msg="小朋友")
def fun3(a,b):
	print(a,b)

fun3("aaa","bbb")

運行結(jié)果:

開始了!小朋友
aaa bbb

類裝飾器

類裝飾器的用法基本和函數(shù)裝飾器一樣,只不過是用類寫的裝飾器

class fun1(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(("開始了!")
        self.func(*args, **kwargs)

@fun1
def fun2(a,b):
	print(a,b)

fun2("aaa","bbb")

類裝飾用到了類的__call__方法

運行結(jié)果:

開始了!
aaa bbb

還可以這樣寫:

class fun(object):
    def __init__(self, msg):
        self.msg = msg
        

    def __call__(self, func):
        def fun1(*args, **kwargs):
            print("開始了!{0}".format(self.msg))
            func(*args, **kwargs)
        return fun1

@fun(msg="小朋友")
def fun2(a, b):
    print(a, b)

fun2("aaa,","bbb")

運行結(jié)果:

開始了!小朋友
aaa, bbb

到此,相信大家對“怎么應(yīng)用python裝飾器”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI