python學習day11 day12 裝飾器

2022-06-19 21:09:12 字數 3000 閱讀 3101

裝飾器是一種特殊的閉包,它是巢狀函式,也呼叫了外部函式的變數,只不是呼叫的是外部函式的形參。

用於裝飾函式

裝飾器的作用 —— 不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能

timmer就是乙個裝飾器函式,只是對乙個函式 有一些裝飾作用

原則: 開放封閉原則

開放 : 對擴充套件是開放的

封閉 : 對修改是封閉的

裝飾器的固定模式:

def inner(*args,**kwargs): #引數為被裝飾函式的原始引數

'''在被裝飾函式之前要做的事'''

ret = f(*args,**kwargs) #被裝飾的函式,ret是被裝飾函式的返回值

'''在被裝飾函式之後要做的事'''

return ret #返回inner中的值 也就是裝飾後的東西

return inner #返回inner的名字

def func(a,b): #被裝飾的函式

time.sleep(0.01)

return '新年好'

ret = func(1,2) #實際上執行的是inner(1,2) 也就是裝飾後的函式

應用:自定義函式func的執行時間+0.01s

import time

def inner(*args,**kwargs):

start = time.time()

ret = f(*args,**kwargs)

end = time.time()

t = end - start

return ret, t

return inner

def func(a,b='zepei'):

c = 70 + a

return b,c

print(func(2,b='fan')) #(('fan', 72), 0.010000228881835938)

裝飾器高階

wraps

from functools import wraps

@wraps(func)

def inner(*args,**kwargs):

print('在被裝飾的函式執行之前做的事')

ret = func(*args,**kwargs)

print('在被裝飾的函式執行之後做的事')

return ret

return inner

def holiday(day):

'''這是乙個放假通知'''

print('全體放假%s天'%day)

return '好開心'

print(holiday.__name__) # 加了wraps後 此處列印的是holiday的名字

print(holiday.__doc__) # 列印holiday的解釋文件

ret = holiday(3) #inner

print(ret)

帶引數的裝飾器

外面再加入乙個巢狀,判斷是否使用裝飾器

import time

flage = false #如果是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()

多個裝飾器裝飾乙個函式

兩個裝飾器詳解:

三個裝飾器:

def inner1():

ret = func() #func=f

return ret

return inner1

def inner2():

ret = func() #func=inner1

return ret

return inner2

def inner3():

ret = func() #func=inner2

return ret

return inner3

def f():

print('in f')

return '哈哈哈'

f() # inner3()

'''輸出:

in f

'''#如果執行下面的,會列印f的輸出

print(f())

'''輸出:

in f

哈哈哈'''

Python學習之路 day 11 裝飾器

一.裝飾器相關 1.什麼是裝飾器 器 指的是具備某一功能的工具 裝飾 指的是為被裝飾器物件新增新功能 裝飾器就是用來為被裝飾器物件新增新功能的工具 注意 裝飾器本身可以是任意可呼叫物件,被裝飾器的物件也可以是任意可呼叫物件 2.為何要用裝飾器 開放封閉原則 封閉指的是對修改封閉,對擴充套件開放 裝飾...

python學習 day11下午

單例模式,可以用在資料庫,這樣只建立一條管道即可 class a def new cls,args,kwargs if not hasattr a,xiaogou cls.xiaogou object.new cls return cls.xiaogou def init self,name sel...

python 學習筆記 day11 裝飾器

現在有乙個需求,我們想計算一段程式執行的時間,可以採用time模組的time函式 def func print 哈哈哈哈 func 我們可以這樣做 import time deffunc start time.time 函式體內 執行開始的時間 time.sleep 0.02 因為這個程式太簡單,執...