python之裝飾器 -前置知識點

裝飾器:

定義:本質是函數,它的目的是用來裝飾其他函數,簡單點理解就是爲其他函數添加附加功能

例:

原來有十個函數

def test1():

    pass

......

def test10():

    passs


現在需要爲這十個函數都要求在執行的時候進行日誌輸出

在未學函數之前是在每個函數裏面都寫上日誌輸出的代碼,如

def test():

   pass

   print(...) #用於代表日誌輸出

.......(寫上十個相同的代碼)


在學完函數調用之後,就把這10個相同的代碼獨立出來,做成一個函數去讓這10個函數去調用

def test():

   pass

   logg()

....test10()

def logg():

   print.....



但如果在生產環境中需要增加這個功能呢,這意味着去修改原代碼,這會產生不可預估的其他後果,如整個業務崩潰。因此在生產環境中原則上一旦代碼功能確定後,就不能去修改原代碼。


因此,裝飾器也依此種情況來做的

裝飾器原則:

1、不能修改被裝飾的函數的源代碼

2、不能修改被裝備的函數的調用方式

總結:裝飾器對被裝飾的函數來說是完全透明的(或者說被裝飾的函數不知道自己被裝飾了)


裝飾器實例:

import time

def timmer(func):

     def warpper(*args,**kwargs):

        start_time = time.time()

        func()

        stop_time = time.time()

        print('the func run time is %s' %(stop_time - start_time))

    return warpper


@timmer    ###添加裝飾器(滿足裝飾器原則)

def test1():

   time.sleep(3)

   print('in the test1)


test1()



實現裝飾器需要具備的知識:

1、函數即“變量”

2、高階函數

    a:把一個函數名當做實參傳給另外一個函數(在不修改裝飾函數源代碼的情況下爲其添加功能)

    b:返回值中包含函數名(不修改函數的調用方式)

3、嵌套函數

利用高階函數+嵌套函數 =》即可實現裝飾器的效果



函數即‘變量’:

在定義一個函數的時候,咱們用

def abc():

     pass  

這樣的方式去定義一個函數。簡單點理解呢就是def是一個關鍵字,不用理它,後面是一個變量abc(),相當於把pass裏面的這些函數體賦值給了abc這個變量。

只不過這個變量有些特殊,調用的時候需要加一個括號甚至再需要傳參數去調用它。



在python中,內存管理機制是這樣的:當內存地址沒人使用的時候,內存回收機制啓用,回收內存地址。如:

x = 1

y = x

時當x和y均沒有指向1這個內存地址時,1這個內存地址回收。若x的值或y的值始終有一個值等於 1,則這個內存地址會被一直佔用,直到程序結束才被釋放

而匿名函數一創建即被回收機制回收(詳見匿名函數)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章