您好,登錄后才能下訂單哦!
不懂Python的裝飾器是用來干嘛的?其實想解決這個問題也不難,下面讓小編帶著大家一起學習怎么去解決,希望大家閱讀完這篇文章后大所收獲。
Python的裝飾器,是一個Python中一個比較難以理解的知識點, 今天我試試說一說,說的如果不好,請見諒。
裝飾器,從字面意思來說,就是修飾一個事物的,在Python里面的作用就是讓一個已經存在的函數擁有一個以前沒有的功能。裝飾器本質上還是一個函數,只是它的功能是為其他函數添加新功能。
那有人會說,我在原來的函數里面加一些代碼,也可以實現啊,為什么還要搞個裝飾器來增加功能呢? 當然,如果你給一個函數加個功能,是可以加代碼, 但是如果是讓你給100個函數代碼塊加一個相同的功能呢? 一個個改代碼嗎? 你會奔潰的。
下面說說一個裝飾器要實現,要符合一定的規則,就是兩個不改動 1.不改動被裝飾函數的源代碼 2.不改動被修飾函數的調用方式
就是你加沒加這個裝飾器,函數要按照原樣來調用
下面說說裝飾器到底怎么寫,怎么用,上面說到裝飾器也是一個函數,但是這個函數和普通的函數不太一樣,他是一個高階函數,那我們給裝飾器大概下個定義
裝飾器:一個可以給別的函數添加新功能的高階函數(當然現在還是不完整的定義)
下面介紹下什么是高階函數。
高階函數: 一個可以接受函數為參數或者能reture 一個函數的函數就是高階函數
是不是有點繞,舉個例子
def f1(): print('普通函數') def f2(func): #f2函數的參數是一個函數,所以它是一個高階函數 print('高階函數1') f1() def f3(func): #f3函數的返回值是一個函數,所以它是一個高階函數 print('高階函數2') return func f2(f1) f3(f1) 結果: 高階函數1 普通函數 高階函數2
有點基礎的人可能知道,這個根本就不是裝飾器,騙人的。當然裝飾器不是這么簡單。
那下面要介紹的一個東西叫嵌套函數,那什么叫嵌套函數呢? 字面意思應該就知道了,函數里面套一個子函數
舉個例子:
def outer(): print('outer') def inner(): print('inner') inner() outer() 結果 outer inner
下面我們要給裝飾器重新下個定義了。
裝飾器:一個可以給別的函數添加新功能的高階函數+嵌套函數
那么我們把高階函數+嵌套函數結合在一起看看
一個可以添加一行日志的裝飾器
def add_log(func): #一個函數作為參數,這個函數就是我們要 def wrapper(): print('我們要加一些日志') #要給原函數添加的新功能,這里就是打印一行日志,當然可以實現其他復雜的功能 func() return wrapper #上面可以看到高階函數+嵌套函數的影子吧,加一起就是一個最簡單的裝飾器拉 @add_log #裝飾器的用法 def f1(): print('普通函數') f1() #調用函數 結果: #看結果f1里面只有print一行,但是結果多了一行,就是裝飾器的作用 我們要加一些日志 普通函數
這些裝飾器大概知道上面意思了吧。
下面說說,上面的裝飾器,有沒有沒有上面問題呢?
看看,仔細看看。 看出來了嗎? 看不出來,我說了哦。
上面我們的f1()函數, 沒有參數,是不是,想想如果f1()函數要加參數怎么辦啊?
def add_log(func): def wrapper(name): print('我們要加一些日志') func(name) return wrapper @add_log def f1(name): print('普通函數 %s' %name) f1('python')
有人是不是想這樣實現呢?
當然這樣是可以的,但是我們不要忘了裝飾器的作用,他不是給某一個固定的函數來使用的,假如現在還需要修飾一個f2(name,age), 那怎么辦啊? 沒辦法,裝飾器的代碼都給你定死了,所以上面這樣寫是不行的。
到底怎么寫呢?
def add_log(func): def wrapper(*args,**kwargs): print('我們要加一些日志') func(*args,**kwargs) return wrapper @add_log def f1(name): print('普通函數 %s' %name) @add_log def f2(name,age): print('我是%s,我%s歲了' %(name,age)) f1('python') f2('java',10)
感謝你能夠認真閱讀完這篇文章,希望小編分享Python的裝飾器是用來干嘛的內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。