裝飾器函式裝飾器
類裝飾器
functools.wraps()
簡介
def
outer_func
(number):
definner_func
(inner_number):
return number + inner_number
return inner_func
# 給外部函式複製,20傳遞給number,並返回內部函式
fun = outer_func(20)
print(fun(100)) # 120
print(fun(200)) # 220
簡介
被裝飾物件為類
裝飾器為類
普通方式
def
fun(test):
definner
(): print('inner')
test()
return inner
deffun1
(): print('func1')
deffun2
(): print('func2')
fun_test = fun(fun1)
fun_test()
fun_test = fun(fun2)
fun_test()
輸出資訊:
inner
func1
inner
func2
函式裝飾器
無參裝飾器
def
decorator
(func):
definner
(): print('開始處理資料')
func()
print('資料處理完畢')
return inner
@decorator
deffunc
(): print('正在處理資料')
func()
輸出資訊:
開始處理資料
正在處理資料
資料處理完畢
帶參裝飾器:被裝飾物件帶參def
decorator
(func):
definner
(x, y):
print('開始處理資料')
result = func(x, y)
print('資料處理完畢')
return result
return inner
@decorator
deffunc
(a, b):
print('正在處理資料')
return a * b
result = func(2, 3)
print(result)
輸出資訊:
開始處理資料
正在處理資料
資料處理完畢
6
帶參裝飾器:被裝飾物件不定長引數def
decorator
(func):
definner
(*args, **kwargs):
print("開始處理資料")
result = func(*args, **kwargs)
print("資料處理完畢")
return result
return inner
@decorator
deffunc1
(a, b):
print('正在處理...')
return
"%s-%s" % (a, b)
@decorator
deffunc2
(a, b, c):
print('正在處理...')
return
"%s,%s,%s" % (a, b, c)
result1 = func2('a', 'b', 'c')
print('返回資料:', result1)
result2 = func1("a", "b")
print('返回資料:', result2)
輸出資訊:
開始處理資料
正在處理...
資料處理完畢
返回資料: a,b,c
開始處理資料
正在處理...
資料處理完畢
返回資料: a-b
帶參裝飾器:裝飾器帶參def
decorator
(arg):
# 裝飾器引數
defmiddle
(func):
definner
(x, y):
print("開始資料處理")
x *= arg
y *= arg
result = func(x, y)
print("資料處理完畢")
return result
return inner
return middle
@decorator(10)
deffunc
(a, b):
print('正在處理資料...')
return a * b
result = func(3, 4)
print(result)
輸出資訊:
開始資料處理
正在處理資料...
資料處理完畢
1200
類裝飾器class
decorator:
def__init__
(self, func):
self.func = func
def__call__
(self, *args, **kwargs):
print('開始處理資料')
self.func()
print('資料處理完畢')
@decorator
deffun
(): print('資料處理中。。。')
fun()
輸出資訊:
開始處理資料
資料處理中。。。
資料處理完畢
functools.wraps()
例如:
def
decorator
(func):
definner
():"""
inner函式
:return:
"""pass
return inner
@decorator
deffunc
():"""
被裝飾函式
:return:
"""pass
print(func.__name__)
print(func.__doc__)
輸出資訊:
inner
inner函式
:return:
由此可見,被裝飾的func的函式資訊丟失了,解決這個問題可以使用functools.wraps()
函式
import functools
defdecorator
(func):
# func的屬性繫結
@functools.wraps(func)
definner
():"""
inner函式
:return:
"""pass
return inner
@decorator
deffunc
():"""
被裝飾函式
:return:
"""pass
print(func.__name__)
print(func.__doc__)
輸出資訊:
func
被裝飾函式
:return:
未完待續。。。 python裝飾器和閉包
下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...
python閉包和裝飾器
要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...
python 閉包和裝飾器
閉包的寫法,兩層函式的巢狀,外部函式返回內部函式的引用,外層函式都帶引數 def 外層函式的名稱 引數 def 內層函式的名稱 pass return 內層函式的引用 def set fun func func 254 defcall fun nonlocal func 修改外層函式的值,並且內部函...