自學Python4.4-裝飾器的進階

自學Python之路-Python基礎+模塊+面向對象
自學Python之路-Python網絡編程
自學Python之路-Python併發編程+數據庫+前端
自學Python之路-djangohtml

自學Python4.4 - 裝飾器的進階

  • 1. functools.wraps
  • 2. 帶參數的裝飾器
  • 3. 多個裝飾器裝飾同一個函數

 1. functools.wraps

對於裝飾器咱們都知道它主要的功能是:在不改變被裝飾的函數及被裝飾的函數的執行方式下,給函數增長額外功能的函數,可是咱們在查看一個函數的註釋和函數名的時候,若是這個函數帶有裝飾器,那麼咱們看到是註釋信息和函數名就是裝飾器裏面的信息,而不是原來函數的信息,那麼如何解決,實例以下:前端

from functools import wraps
def wrapper(func):  #func = holiday
    @wraps(func)
    def inner(*args,**kwargs):
        print('在被裝飾的函數執行以前作的事')
        ret = func(*args,**kwargs)
        print('在被裝飾的函數執行以後作的事')
        return ret
    return inner

@wrapper   #holiday = wrapper(holiday)
def holiday(day):
    '''這是一個放假通知'''
    print('全體放假%s天'%day)
    return '好開心'

print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)   #inner
print(ret)

 

2. 帶參數的裝飾器

 

假如大家公司有300個函數使用了同一個裝飾器,如今那領導讓你把這些裝飾器所有取消掉,你該怎麼作? 數據庫

 

使用最笨的辦法一個一個添加?這樣的話須要添加多長時間?而後幾天以後領導說再把那些裝飾器加上吧,你什麼思想?那這個時候就能夠用到帶有參數的裝飾器:django

 

import time
FLAGE = False
def timmer_out(flag):
    def timmer(func):
        def inner(*args,**kwargs):
            if flag:
                start = time.time()
                ret = func(*args,**kwargs)
                end = time.time()
                print(end-start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret
        return inner
    return timmer
# timmer = timmer_out(FLAGE)
@timmer_out(FLAGE)    #wahaha = timmer(wahaha)
def wahaha():
    time.sleep(0.1)
    print('wahahahahahaha')

@timmer_out(FLAGE)
def erguotou():
    time.sleep(0.1)
    print('erguotoutoutou')

wahaha()
erguotou()

3. 多個裝飾器裝飾同一個函數

在實際生產中,有的時候可能會用到多個裝飾器來裝飾同一個函數,下面咱們就來講一下多個裝飾器在裝飾同一個函數具體的過程,實例以下:編程

def wrapper1(func):
    def inner1():
        print('wrapper1 ,before func')
        ret = func()
        print('wrapper1 ,after func')
        return ret
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2 ,before func')
        ret = func()
        print('wrapper2 ,after func')
        return ret
    return inner2

def wrapper3(func):
    def inner3():
        print('wrapper3 ,before func')
        ret = func()
        print('wrapper3 ,after func')
        return ret
    return inner3

@wrapper3
@wrapper2
@wrapper1
def f():
    print('in f')
    return '哈哈哈'

print(f())

相關文章
相關標籤/搜索