Python學習之Part16 裝飾器高階

2021-10-01 23:43:43 字數 3813 閱讀 8752

應用場景:

在使用裝飾器對原函式進行裝飾後,可以控制裝飾器什麼生效,什麼時候不生效

即在想使用原函式時,不需要對語法糖進行注釋,或者刪除裝飾器

以下使用乙個例子進行說明:

import time

# 定義flag標誌位,當為真的時候,裝飾器生效,否則裝飾器不生效

falg =

false

deftimmer_out

(flag)

:def

timmer

(func)

:def

inner

(*args,

**kwargs)

:if flag:

start = time.time(

) res = func(

*args,

**kwargs)

end = time.time(

)print

(end-start)

return res

else

: res = func(

*args,

**kwargs)

return res

return inner

return timmer

""" @timmer_out(falg)

等價於:

timmer = timmer_out(flag)

@timmer

@timmer_out(flag):

先執行timmer_out(falg),將flag標誌位的值傳遞進函式中,返回內部函式timmer的引用,

再@timmer執行此語法糖:func = timmer(func) == inner

falg標誌位:

當flag=true,則裝飾器生效,執行if語句塊;

當flag=false,則執行else語句塊內容,也就是func原函式,此時裝飾器不生效

使用此方法,當使用裝飾器裝飾了多個函式後,若想恢復原函式的功能,

則更改flag的值即可,不需要對裝飾器或者語法糖進行修改

"""@timmer_out(falg)

deffunc1()

: time.sleep(

0.1)

print

('this is function 1'

)@timmer_out(falg)

deffunc2()

: time.sleep(

0.1)

print

('this is function 2'

)print

('falg的值 :'

, falg)

func1(

)func2(

)

當falg=false時,裝飾器失效,僅執行原函式的功能:

當falg=true時,裝飾器生效,執行結果:

使用下面例子來進行說明:

def

(func)

:print()

definner1()

:print

('---in inner11---'

) func(

)print

('---in inner12---'

)print()

return inner1

def(func)

:print()

definner2()

:print

('---in inner21---'

) func(

)print

('---in inner22---'

)print()

return inner2

deff()

:print

('---in f---')f(

)

需要引入新的模組: functools

基礎檢視

def

func_test()

:'''

乙個用來測試的函式

:return: none

'''print

('測試函式'

)#檢視字串格式的函式名

print

(func_test.__name__)

# 檢視此函式的注釋

print

(func_test.__doc__)

輸出結果:

def

(fun)

:def

inner

(*args,

**kwargs)

:'''

:param args: inner引數

:param kwargs: inner引數

:return: inner

'''res = fun(

*args,

**kwargs)

return res

return inner

deffunc

(a,b)

:return a,b

res = func(

111,

222)

print

(func.__name__)

print

(func.__doc__)

我們可以看到,此時只能獲取裝飾器內函式的資訊:

想要獲取被裝飾函式的資訊,需要使用functools模組:

from functools import wraps

def(fun)

: @wraps(fun)

definner

(*args,

**kwargs)

: res = fun(

*args,

**kwargs)

return res

return inner

deffunc

(a,b)

:'''這是被裝飾函式func'''

# print('hello python',a,b)

return a,b

res = func(

111,

222)

print

('函式名: '

,func.__name__)

print

('函式注釋: '

,func.__doc__)

urllib是python自帶的模組

from urllib.request import urlopen

# 拿到網頁的源**

defget_url()

: url =

''defget()

: res = urlopen(url)

.read(

)print

(res)

return get

get_func = get_url(

)# 在每次執行get_func時不需要再重新定義url並開闢空間

get_func(

)

走近分形與混沌 part16 三與自組織

學習筆記 學習書目 蝴蝶效應之謎 走近分形與混沌 張天蓉 我們在前幾個blog中介紹了邏輯斯蒂系統。我們知道邏輯斯蒂系統是描述生態繁衍的,如果最後的群體數趨向乙個固定值,叫做週期1 如果最後群體數在兩個固定值之間跳來跳去,就叫週期2 如果最後群體數在3個值之間跳,就叫週期3了。我們馬上要介紹的就是約...

Python學習之Part06 集合

定義乙個空集合 s set type s class set s1 set type s1 class set s2 set type s2 class set 定義乙個集合並初始化 集合中的元素不能重複 s print s,type s class set 列表的快速去重 li 1 2,hello...

Python學習part4 Python的檔案操作

首先我們來看一道題 1.統計this.txt檔案中字母 a z 大寫字母 a z 數字 0 9 其他字元的個數。我們可以用兩種方法來完成 1.普通方法 l 0a 0b 0d 0with open c users admin desktop text this.txt r as fr txt fr.r...