裝飾器

裝飾器(decorator)

  • 裝飾器本質上是一個python函數,他能夠讓其餘函數在不須要作任何代碼變更的前提下增長額外功能,裝飾器的返回值也是一個函數對象。python

  • 應用場景:插入日誌,性能測試,事務處理,緩存,權限校驗緩存

  • 做用:爲了已經存在的函數或者對象添加額外的功能app

    例子1:
    def w1(func):
      def inner():
          #能夠加if判斷
          print("---驗證---")
          func()
      return inner
    
    #f1=w1(f1)
    @w1
    def f1():
      print('f1')
    
    #調用
    f1()

雙層裝飾器

  • 裝飾是從下裝到上,調用是從上到下。函數

    def w1(func):
      print("--正在裝飾1--")
      def inner():
          print("--正在驗證1--")
          func()
      return inner
    
    def w2(func):
      print("--正在裝飾2--")
      def inner():
          print("--正在驗證2--")
          func()
      return inner
    
    @w1
    @w2
    def f1():
      print("--f1--")
    #裝飾倒着裝,調用是從上到下。
    f1()
    
    ###執行結果###
    --正在裝飾2--
    --正在裝飾1--
    --正在驗證1--
    --正在驗證2--
    --f1--

裝飾器不定長參數

from time import ctime, sleep
def timefun(func):
    #給函數傳參數
    def wrappedfunc(*args,**kw):
        print("%s called at %s"%(func.__name__, ctime()))
        func(*args,*kw)
    return wrappedfunc

@timefun
def foo(a,b,c):
    print(a+b+c)

foo(1,2,3)
foo called at Tue Jan  1 17:16:15 2019
6

裝飾器return

def func(fun):
    def func_in(*args,**kwargs):
        #ret保存return 返回值,若是沒有返回值爲None
        ret = fun(*args,**kwargs)
        return ret
    return func_in

@func
def test(args):
    print("---%s--"%(args))
    return "haha"
print(test(1))

裝飾器帶參數

def func_arg(arg):
    def fun(fun):
        def func():
            print("--記錄日誌--%s"%(arg))
            if arg=="heihei":
                fun()
            else:
                pass
        return func
    return fun

#1.先執行func_arg函數,return 結果是這個fun函數
#等於使用@fun 對test進行裝飾
@func_arg("heihei")
def test():
    print("--test--")

test()

--記錄日誌--heihei
--test--

類裝飾器

class test(object):
    #重寫這個call方法,讓類加上()就能夠被調用。
    def __call__(self):
            print("--test--")
t = test()
t()

--打印結果--
--test--
######

類裝飾器

class Test(object):
    def __init__(self,func):
        print("---初始化--")
        print("func name is %s"%(func.__name__))
        self.__func = func

    def __call__(self):
        print("--裝飾器中的功能---")
        self.__func()

@Test
def test():
    print("---test--")

test()
--打印結果--
---初始化--
func name is test
--裝飾器中的功能---
---test--
相關文章
相關標籤/搜索