1. 程式人生 > >Python_裝飾器

Python_裝飾器

做的 修改 teacher import pytho 模式 地址 執行 系統

  Teacher say : 沒有任何一家專面python的公司會不提裝飾器的

os模塊:和操作系統做交互的時候

#裝飾器形成的過程

#裝飾器的作用

#原則: 開發封閉原則

#裝飾器的固定模式

import time

time.sleep(5)  #讓程序在執行到這個位置的時候停一會

time.time()  #記錄從190年開始到現在 過了多少秒

什麽是裝飾器?

在不修改函數調用方式的情況下, 但是還想在原來的函數前後添加功能

timer就是一個裝飾器函數,只是對一個函數有一些裝飾功能

例:

    

    def timer(f) :     #是一個裝飾器函數

      def inner(*args,**kwargs) : #*args 傳進去的是一個元組,傳進去一個動態參數 (*args,**kwargs)可以覆蓋所有的動態參數類型

        start = time.time()

        f(*args,**kwargs)     #被裝飾的函數

        end = time.time()

        print( end - start)

      return inner

   @timer     #語法糖 @裝飾器函數名, 定義在被裝飾函數的上一行

   def func() :      #被裝飾的函數

      time.sleep(0.01)

      print(‘裝飾器學習‘)

 #  func = timer(func)    #加入語法糖@timer 此句則省略

    func()

#原則: 開放封閉原則

#  開放:對擴展是開放的

#  封閉:對修改是封閉的

#  封版

被裝飾函數的返回值問題:

  因為被裝飾函數的 @timer(語法糖),因而被修飾函數地址改變,所以被修飾函數的返回值拿不到,需要在裝飾器最後return 被修飾函數

  被裝飾函數傳參問題 : 需要用裝飾帶參數函數的裝飾器

總結:裝飾器的固定模式

  def wrapper(f) :

    def inner(*args,**kwargs) :

      #在被裝飾函數之前要做的事

      ret = f(*args,**kwargs)

      #在被裝飾函數之後要做的事情

      return ret

    return inner

Python_裝飾器