python3之裝飾器學習

2021-08-19 03:33:47 字數 2613 閱讀 2941

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