Python的裝飾器,是一個Python中一個比較難以理解的知識點, 今天我試試說一說,說的若是很差,請見諒。
裝飾器,從字面意思來講,就是修飾一個事物的,在Python裏面的做用就是讓一個已經存在的函數擁有一個之前沒有的功能。裝飾器本質上仍是一個函數,知識他的功能是爲其餘函數添加新功能。
那有人會說,我在原來的函數裏面加一些代碼,也能夠實現啊,爲何還要搞個裝飾器來增長功能呢? 固然,若是你給一個函數加個功能,是能夠加代碼, 可是若是是讓你給100個函數代碼塊加一個相同的功能呢? 一個個改代碼嗎? 你會奔潰的。
下面說說一個裝飾器要實現,要符合必定的規則,就是兩個不改動 1.不改動被裝飾函數的源代碼 2.不改動被修飾函數的調用方式
下面說說裝飾器到底怎麼寫,怎麼用,上面說到裝飾器也是一個函數,可是這個函數和普通的函數不太同樣,他是一個高階函數,那咱們給裝飾器大概下個定義
裝飾器:一個能夠給別的函數添加新功能的高階函數(固然如今仍是不完整的定義)
高階函數: 一個能夠接受函數爲參數或者能reture 一個函數的函數就是高階函數
def f1():
print('普通函數')
def f2(func):
print('高階函數1')
f1()
def f3(func):
print('高階函數2')
return func
f2(f1)
f3(f1)
結果:
高階函數1
普通函數
高階函數2複製代碼
交流羣:887934385 羣內有分享相關資料,有問題共同討論
有點基礎的人可能知道,這個根本就不是裝飾器,騙人的。固然裝飾器不是這麼簡單。
那下面要介紹的一個東西叫嵌套函數,那什麼叫嵌套函數呢? 字面意思應該就知道了,函數裏面套一個子函數
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()函數, 沒有參數,是否是,想一想若是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 咱們要加一些日誌 我是java,我10歲了
上面的寫法,是否是能夠了,是否是,無論任何函數,任何參數,都OK了,至於args,*kwargs啥意思,你們能夠去百度下啊。這裏就很少說了
今天就說這麼多,但願你們對於python的裝飾器有個基本的瞭解。
這裏留個彩蛋,上面的最終的代碼,你以爲還有問題嗎?仔細看,若是能看出來歡迎給我留言,如何看不出來,看我下回分解。