裝飾器修飾帶引數的功能函式

2022-05-17 19:47:30 字數 1186 閱讀 8753

1

"""2

帶引數的功能函式的裝飾

3"""

4import

time

5def

writelog(func):

6print('

訪問了方法名:

',func.__name__,'

',time.asctime())78

#定義乙個閉包

9def

funout(func):

10def

funin(x,y):

11writelog(func)

12return

func(x,y)

13return

funin

1415

#新增裝飾器

16 @funout #

相當於執行:f = funout(sum) 把該功能函式名作為外部函式的變數引數執行

17def

sum(a,b):

18return a +b

1920 result = sum(10,20)

21print('

兩數之和:

',result)

22"""

23分析:執行過程

24@funout # 相當於執行:f = funout(sum) 把該功能函式名作為外部函式的變數引數執行,

25外部函式執行完返回內部函式的函式名:funin,指向內部函式,內部函式使用外部函式的變數引數sum,

26funin呼叫內部函式,執行:writelog(sum)和sum(10,20),並返回。

27"""28#

功能函式中有三個引數

29def

funout2(func):

30def

funin(a,b,c):

31writelog(func)

32return

func(a,b,c)

33return

funin

34@funout2

35def

add(a,b,c):

36return a+b+c

37 result = add(10,20,30)

38print('

三數之和:

',result)

2 兩數之和: 30

4 三數之和: 60

帶函式引數的裝飾器 複雜裝飾器 的例子

帶函式引數的裝飾器的作用就是,不用寫裝飾器了,寫函式就行了,寫函式就相當於寫裝飾器了。在第15行,對index 函式進行 裝飾,此裝飾器帶有兩個函式引數,那現在是根據python的內部語法機制傳index 函式的位址,還是傳自己寫的兩個函式記憶體 位址呢?假如沒有函式位址引數,則會對index 函式...

編寫可選引數的裝飾器函式

想編寫乙個裝飾器,該裝飾器可以不帶引數 如 decorator 使用,也可以帶可選引數 如 decorator x,y,z 使用。但是,由於簡單修飾符和帶有引數的修飾符之間的呼叫約定不同,因此似乎沒有直接的方法。以下示例解決了這種程式設計一致性問題 from functools import wra...

編寫可選引數的裝飾器函式

想編寫乙個裝飾器,該裝飾器可以不帶引數 如 decorator 使用,也可以帶可選引數 如 decorator x,y,z 使用。但是,由於簡單修飾符和帶有引數的修飾符之間的呼叫約定不同,因此似乎沒有直接的方法。以下示例解決了這種程式設計一致性問題 from functools import wra...