應用場景:以下使用乙個例子進行說明:在使用裝飾器對原函式進行裝飾後,可以控制裝飾器什麼生效,什麼時候不生效
即在想使用原函式時,不需要對語法糖進行注釋,或者刪除裝飾器
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...