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...