python函式詳解 裝飾器011

2021-09-10 09:18:16 字數 2181 閱讀 4304

1、什麼樣的函式稱為閉包函式?

主要滿足兩點:函式內部定義了函式,引用了外部變數但非全域性變數

2、python裝飾器用於擴充套件原來函式功能的一種函式

3、裝飾器的作用:它可以讓被裝飾的函式在不需要做任何**變動的前提下增加額外的功能,裝飾器的返回值也是乙個函式物件

(函式的指標)

裝飾器的外部函式傳入我要裝飾的函式名字,返回經過修飾後函式的名字;內層函式(閉包)負責修飾被裝飾的函式。從上面記住幾點屬性,以後便於後面更好的理解:

實質:是乙個函式

引數:是你要被裝飾的函式名(並非呼叫函式)

返回:是裝飾完的函式名(也非呼叫函式)

作用:為已經存在的物件新增額外的功能

特點:不需要對物件**做任何**上的變動

import time

def func():

time.sleep(0.01)

print('**執行時長:裝飾器')

def timmer(f): # 裝飾器函式

def inner():

start = time.time()

f() # 被裝飾器的函式

end = time.time()

print(end-start)

return inner

func = timmer(func)

func()

# **執行時長:裝飾器

# 0.01500082015991211

4、python裝飾器有很多經典的應用場景,比如:插入日誌的效能測試、事務處理、許可權校驗等。

裝飾器是解決這類問題的絕佳設計。

5、函式原則:開放封閉原則

(1)開放:對擴充套件是開放的

(2)封閉:對修改是封閉的

6、語法糖

import time

def timmer(f): # 裝飾器函式

def inner():

start = time.time()

ret = f() # 被裝飾的函式

end = time.time()

print(end - start)

return ret

return inner

@timmer # @裝飾器的函式名

def func():

time.sleep(0.01)

print('被裝飾的函式')

return '裝飾器'

print(func())

8、裝飾器的固定模式

# 例子

import time

def timmer(f): # 裝飾器函式

def inner(*args,**kwargs):

"""被裝飾的函式執行前增加的功能"""

ret = f(*args,**kwargs) # 被裝飾的函式

"""被裝飾的函式執行後增加的功能"""

return ret

return inner

@timmer # @裝飾器名

def func(a,b): # 被裝飾的函式

time.sleep(0.01)

print('被裝飾器函式 ')

return '裝飾器'

func = timmer(func) # 演變原理

print(func(1,2))

9、複習裝飾器:

(1)開發原則:開放封閉原則(即只可擴充套件功能,不可修改函式)

(2)裝飾器的作用:在不改變原函式呼叫方式的情況下,在函式的前後新增功能

(3)裝飾器的本質:閉包函式

import time

def inner(*args,**kwargs):

"""呼叫被裝飾的函式執行前新增的功能"""

ret = f(*args,**kwargs)

"""呼叫被裝飾的函式執行後新增的功能"""

return ret

return inner

def holiday(day):

print('全天放假%s天'%day)

return '好開心!'

ret = holiday(3)

print(ret)

如果想要在函式內定義全域性作用域,需要加上global修飾符

詳解裝飾模式

顧名思義,裝飾模式就是給乙個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同乙個介面,裝飾物件持有被裝飾物件的例項,關係圖如下 source類是被裝飾類,decorator類是乙個裝飾類,可以為source類動態的新增一些功能,如下 public inte ce sourceabl...

Python函式裝飾器詳解

3 內建裝飾器 增強函式或類的功能的乙個函式,可以裝飾函式,也可以裝飾類 def time decorator func 裝飾器 def args,kwargs 在函式前列印開始時間 start time time.time print start time is start time 執行待裝飾函...

python 在場景中理解裝飾器

原來我也自己通過查資料,來學習python的裝飾器,但是效果不好。因為沒有接觸過需要用到裝飾器的場景,所以 一起的資料都只停留在紙面上,但是今天偶然看到了vimer的這篇文章 我們就根據這篇文章的思路來,在場景中理解python裝飾器 解決方案 該爬蟲呼叫三個方法,設計乙個通用的方法 根據每個方法的...