Python裝飾器詳細舉例

2021-10-19 13:57:11 字數 4249 閱讀 8009

# ********************==

# 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裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...