def 外部函式(引數):
def 內部函式():
pass
return 內部函式
@外部函式
def test():
pass
def set_fun(func):
def call_fun():
print("許可權認證")
func()
return call_fun
@set_fun # test = set_fun(test)
def test():
print("test")
test()
裝飾前的test,是由func指向的
裝飾後的test,其實是call_fun的引用
def set_fun(func):
def call_fun():
return func()
return call_fun
@set_fun # test = set_fun(test)
def test():
return 1000
print(test())
裝飾前的test函式,這個是由func指向
裝飾後的test函式,其實就是call_fun
裝飾器原則上是不能改變原先test函式的結果(道德)
def set_fun(func):
def call_fun(args):
func(args)
return call_fun
@set_fun #test = set_fun(test)
def test(args):
print(args)
test(1234)
裝飾前的test函式,是由func指向
裝飾後的test函式,是由call_fun指向
裝飾器不會去改變裝飾的函式的值跟呼叫方式
call_fun ,func 跟test引數保持一致
def set_fun(func):
def call_fun(*args,**kwargs):
func(*args,**kwargs) #這裡需要拆包
return call_fun
@set_fun #test = set_fun(test)
def test(*args,**kwargs):
print(args)
print(kwargs)
test(1234,a = 5)
裝飾前的test函式,是由func指向
裝飾後的test函式,是由call_fun指向
裝飾器不會去改變裝飾的函式的值跟呼叫方式
call_fun ,func 跟test引數保持一致
def set_fun(func):
def call_fun(*args,**kwargs):
return func(*args,**kwargs) #拆包
return call_fun
@set_fun
def test(*args,**kwargs):
print(args)
print(kwargs)
return 100
print(test(123, a=5))
裝飾前的test是由func指向的
裝飾後的test是由call_fun指向
裝飾器不能改變原先函式的返回值及呼叫方式
func,原先的test,call_fun,保持一致
class a(object):
def __init__(self,func):
print(func)
self.func = func
def __call__(self, *args, **kwargs):
print("新增額外的功能")
self.func()
@a #test = a(test)
def test():
print("test")
test()
理解裝飾器傳參
裝飾器傳參:是三個函式的巢狀,第三層內部包含乙個閉包,第三層返回閉包的引用(閉包的外部引用)
def set_args(*args):
print(args)
def set_fun(func):
print("set_fun")
def call_fun(*args, **kwargs):
print("call_fun")
return func(*args, **kwargs)
return call_fun
return set_fun
@set_args("那個誰", "你愛我嗎?")
def test():
print("test")
test() # 呼叫test函式 閉包中的func才會執行有返回值
第一步先執行@setargs(***)這個函式 得到閉包的引用,第二步@閉包的引用(@setfun) python3 深入裝飾器
def outer c def inner uname print 我是 end c uname return inner outer def fun 1 uname print f 北京的 fun 1 mike def outer c def inner args,kwargs 通用的形參的設定 ...
Python3 高階 裝飾器
1.裝飾器功能 在不修改原函式的情況下,增強函式功能 2.不帶引數的函式 不帶引數的裝飾器 1 foo 被裝飾的函式 2 show time 是裝飾器 coding utf 8 import time def show time func def inner start time time.time...
python3裝飾器 高階
作用 優化裝飾器 from functools import wraps 匯入wraps def wraps f wraps的語法糖 def inner args,kwargs ret f args,kwargs return ret return inner deff1 print hello,w...