# ********************==
# coding: utf-8
# author:mr. luo
# date:2021/2/19 15:23
# ********************===
def too():
print("豬八戒")
# 基礎的函式呼叫操作
print('豬八戒到底是哪八戒'.center(20, '*'))
too()
a = too
print(type(a))
a()# 基本的函式引數傳遞操作
print('豬八戒到底是哪八戒'.center(20, '*'))
def fa(fun):
print('傳進去函式本身,而不是返回值')
fun()
print('函式在函式內部執行結束')
fa(too)
print('豬八戒到底是哪八戒'.center(20, '*'))
# 構造乙個裝飾器
def fa(fun):
def zs():
print('傳進去函式本身,而不是返回值')
fun()
print('函式在函式內部執行結束')
# 返回的是乙個函式,
return zs
# 因為最終返回的是乙個zs函式,所以要加上(),
# 這樣最後的呼叫結果就和上邊結果保持一致了
fa(too)()
執行結果:
*****豬八戒到底是哪八戒******
豬八戒豬八戒
*****豬八戒到底是哪八戒******
傳進去函式本身,而不是返回值
豬八戒函式在函式內部執行結束
*****豬八戒到底是哪八戒******
傳進去函式本身,而不是返回值
豬八戒函式在函式內部執行結束
上邊就是定義乙個裝飾器的過程,但是寫法太麻煩,如下的寫法:
# ********************==
# coding: utf-8
# author:mr. luo
# date:2021/2/19 16:26
# ********************===
print('豬八戒到底是哪八戒'.center(20, '*'))
# 構造乙個裝飾器
def fa(fun):
def zs():
print('傳進去函式本身,而不是返回值')
fun()
print('函式在函式內部執行結束')
# 返回的是乙個函式,
return zs
# 在構造乙個裝飾器
def faa(fun):
def zs1():
print('faa:before')
fun()
print('faa:end')
# 返回的是乙個函式,
return zs1
@faa
@fa# 裝飾器,本質上將too作為引數傳遞到fa()函式中,這個時候就不必在使用fa(too)()這個費勁的寫法了
def too():
print("本尊:豬八戒可能比哮天犬還老")
# 直接呼叫too()函式就可以實現同樣的效果
too()
# 此外裝飾器是可以疊加的,
# 具體疊加的呼叫過程,通過執行結果來看
執行結果如下:
*****豬八戒到底是哪八戒******
faa:before
傳進去函式本身,而不是返回值
本尊:豬八戒可能比哮天犬還老
函式在函式內部執行結束
faa:end
裝飾器簡單的使用
# ********************==
# coding: utf-8
# author:mr. luo
# date:2021/2/19 16:41
# ********************===
'''裝飾器可以拿來計時
'''import time
def time1(fun):
def inner():
print("內層函式 start!")
s = time.time()
fun()
e = time.time()
print("內層函式 end!")
# 注意這裡f的用法
print(f" was finished in secs.")
return inner
# 裝飾器
@time1
def sleep_method():
time.sleep(7)
print("休息7秒 end!")
sleep_method()
執行結果:
內層函式 start!
休息7秒 end!
內層函式 end!
sleep_method was finished in 7.000257730484009 secs.
下圖列舉了裝飾器的使用場景
舉例子使用裝飾器給函式計時:
輸出結果:# ********************==
# coding: utf-8
# author:mr. luo
# date:2021/2/19 20:44
# ********************===
import time
def timer(fun):
'''定義裝飾器
:param fun:
:return:
'''time_start = time.time()
fun()
time_end = time.time()
cost_time = time_end -time_start
print(f"函式的花費時間為:", cost_time, 'secs')
# 通過@呼叫裝飾器
@timer
def fun1():
'''函式1
:return:
'''time.sleep(1)
for i in range(100):
pass
# 通過@呼叫裝飾器
@timer
def fun2():
time.sleep(2)
print("閒處光陰易過")
# 通過@呼叫裝飾器
@timer
def fun3():
time.sleep(3)
print("如花美眷,怎敵似水流年")
# 通過@呼叫裝飾器
@timer
def fun4(**kwargs):
time.sleep(4)
for item, value in kwargs.items():
print(item,':', value)
if __name__ == '__main__':
x =
y =
fun1()
fun2()
fun3()
fun4()
函式的花費時間為: 1.0019502639770508 secs
閒處光陰易過
函式的花費時間為: 2.002023696899414 secs
如花美眷,怎敵似水流年
函式的花費時間為: 3.0065841674804688 secs
函式的花費時間為: 4.001547574996948 secs
如下正確操作:
import time
def fun4(**kwargs):
time.sleep(1)
for item, value in kwargs.items():
print(item,':', value)
x =
y =
fun4(**x)
輸出結果:
賈寶玉 : 23
林黛玉 : 32
舉例講解python裝飾器的使用
需求 領導想知道,該測試用例執行,用例的執行時間是多少,我們怎麼實現該 如下 想要實現下面用例的執行時間是多少,怎麼做?def creat oder 這個是原 一條測試用例 print 執行測試用例 time.sleep 1 你可能會想到,記錄開始時間,結束時間,然後計算差就行了唄,好,那我們來看看...
python裝飾器的詳細解析
寫在前面 python裝飾器 fuctional decorators 就是用於拓展原來函式功能的一種函式,目的是在不改變原函式名 或類名 的情況下,給函式增加新的功能。這個函式的特殊之處在於它的返回值也是乙個函式,這個函式是內嵌 原 函式的函式。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...