裝飾器:
定義:本質是函數,它的目的是用來裝飾其他函數,簡單點理解就是爲其他函數添加附加功能
例:
原來有十個函數
def test1():
pass
......
def test10():
passs
現在需要爲這十個函數都要求在執行的時候進行日誌輸出
在未學函數之前是在每個函數裏面都寫上日誌輸出的代碼,如
def test():
pass
print(...) #用於代表日誌輸出
.......(寫上十個相同的代碼)
在學完函數調用之後,就把這10個相同的代碼獨立出來,做成一個函數去讓這10個函數去調用
def test():
pass
logg()
....test10()
def logg():
print.....
但如果在生產環境中需要增加這個功能呢,這意味着去修改原代碼,這會產生不可預估的其他後果,如整個業務崩潰。因此在生產環境中原則上一旦代碼功能確定後,就不能去修改原代碼。
因此,裝飾器也依此種情況來做的
裝飾器原則:
1、不能修改被裝飾的函數的源代碼
2、不能修改被裝備的函數的調用方式
總結:裝飾器對被裝飾的函數來說是完全透明的(或者說被裝飾的函數不知道自己被裝飾了)
裝飾器實例:
import time
def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time()
func()
stop_time = time.time()
print('the func run time is %s' %(stop_time - start_time))
return warpper
@timmer ###添加裝飾器(滿足裝飾器原則)
def test1():
time.sleep(3)
print('in the test1)
test1()
實現裝飾器需要具備的知識:
1、函數即“變量”
2、高階函數
a:把一個函數名當做實參傳給另外一個函數(在不修改裝飾函數源代碼的情況下爲其添加功能)
b:返回值中包含函數名(不修改函數的調用方式)
3、嵌套函數
利用高階函數+嵌套函數 =》即可實現裝飾器的效果
函數即‘變量’:
在定義一個函數的時候,咱們用
def abc():
pass
這樣的方式去定義一個函數。簡單點理解呢就是def是一個關鍵字,不用理它,後面是一個變量abc(),相當於把pass裏面的這些函數體賦值給了abc這個變量。
只不過這個變量有些特殊,調用的時候需要加一個括號甚至再需要傳參數去調用它。
在python中,內存管理機制是這樣的:當內存地址沒人使用的時候,內存回收機制啓用,回收內存地址。如:
x = 1
y = x
時當x和y均沒有指向1這個內存地址時,1這個內存地址回收。若x的值或y的值始終有一個值等於 1,則這個內存地址會被一直佔用,直到程序結束才被釋放
而匿名函數一創建即被回收機制回收(詳見匿名函數)