筆記||Python3進階之裝飾器

# 裝飾器
# 特徵: 是用一個@開頭的字符串
# 裝飾器一般用來裝飾函數、或者類的方法
# 被裝飾後的函數,一般是在原有的函數基礎上,會多出增長一點功能
# 通常來講裝飾器自己也是一個函數
#
# def test(name):
#           def test_in():
#                  print(name)
#           return test_in
#
# func = test('peiyanan')
# func()app

'''
邏輯思想:①首先把peiyanan實參傳遞給test函數
              ②在執行test函數時,又返回到test_in函數
              ③執行test_in函數並打印輸出
'''函數

# =================================================================================
# 不帶參數的裝飾器(裝飾器、被裝飾函數都不帶參數)
# import time
# def showTime(func):
#              def wrapper():
#                      start = time.time()
#                      func()
#                      end = time.time()
#                      print('spend is {}'.format(end-start))
#
#              return wrapper
#
#
#
# @showTime       # foo = showTime(foo)
# def foo():
#         print('foo..')
#         time.sleep(3)
#
#
# foo()orm

'''
邏輯思想:①首先將foo函數當作參數的形式傳遞到showTime函數中去
              ②在執行showTime函數的同時,會先打印出foo函數中的
              ③而後又將返回給wrapper函數
              ④最後逕wrapper函數並打印輸出
'''字符串

# ==================================================================================
# 帶參數的被裝飾的函數
import time
def showTime(func):
      def wrapper(x, y):
            start = time.time()
            func(x, y)
            end = time.time()
            print('spend is {}'.format(end-start))form

      return wrapperclass


@showTime       # foo = showTime(foo)
def foo(x, y):
        print(x+y)
        time.sleep(3)test


foo(4, 5)import

'''
邏輯思想:①foo函數調用,執行foo函數體並打印輸出
              ②接着showTime函數調用foo(這裏foo既能夠看作一個參數,也能夠看作是一個函數),傳遞給showTime函數體
              ③執行showTime函數體,遇到return,又返回給了wrapper函數體
              ④執行wrapper函數體時,一次執行並最後輸出
'''基礎

# 使用裝飾器的缺點
# 不要在裝飾器以外添加邏輯功能
# 不能裝飾@staticmethod或者@classmethod已經裝飾過的方法
# 裝飾器會對原函數的原信息進行更改
# 裝飾器
# 特徵: 是用一個@開頭的字符串
# 裝飾器一般用來裝飾函數、或者類的方法
# 被裝飾後的函數,一般是在原有的函數基礎上,會多出增長一點功能
# 通常來講裝飾器自己也是一個函數
#
# def test(name):
#        def test_in():
#             print(name)
#        return test_in
#
# func = test('peiyanan')
# func()方法

'''
邏輯思想:①首先把peiyanan實參傳遞給test函數
              ②在執行test函數時,又返回到test_in函數
              ③執行test_in函數並打印輸出
'''

# =================================================================================
# 不帶參數的裝飾器(裝飾器、被裝飾函數都不帶參數)
# import time
# def showTime(func):
#          def wrapper():
#                 start = time.time()
#                 func()
#                 end = time.time()
#                 print('spend is {}'.format(end-start))
#
#          return wrapper
#
#
#
# @showTime          # foo = showTime(foo)
# def foo():
#        print('foo..')
#        time.sleep(3)
#
#
# foo()

'''
邏輯思想:①首先將foo函數當作參數的形式傳遞到showTime函數中去
              ②在執行showTime函數的同時,會先打印出foo函數中的
              ③而後又將返回給wrapper函數
              ④最後逕wrapper函數並打印輸出
'''

# ==================================================================================
# 帶參數的被裝飾的函數
import time
def showTime(func):
           def wrapper(x, y):
                  start = time.time()
                  func(x, y)
                  end = time.time()
                  print('spend is {}'.format(end-start))

           return wrapper


@showTime        # foo = showTime(foo)
def foo(x, y):
         print(x+y)
         time.sleep(3)


foo(4, 5)

'''
邏輯思想:①foo函數調用,執行foo函數體並打印輸出
              ②接着showTime函數調用foo(這裏foo既能夠看作一個參數,也能夠看作是一個函數),傳遞給showTime函數體
              ③執行showTime函數體,遇到return,又返回給了wrapper函數體
              ④執行wrapper函數體時,一次執行並最後輸出
'''

# 使用裝飾器的缺點# 不要在裝飾器以外添加邏輯功能# 不能裝飾@staticmethod或者@classmethod已經裝飾過的方法# 裝飾器會對原函數的原信息進行更改

相關文章
相關標籤/搜索