Python学习之路--装饰器
生活随笔
收集整理的這篇文章主要介紹了
Python学习之路--装饰器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
三元運(yùn)算 變量 = 條件返回True的結(jié)果 if 條件 else 條件返回False ,用于簡單
import time
time.time() 1970年至今多少秒
time.sleep()暫時休眠
裝飾器形成過程
def func():time.sleep(0.01)print('fds') def timmer(f): #裝飾器函數(shù)def inner():start = time.time()f() #被裝飾的函數(shù)end = time.time()print(end - start)return inner func = timmer(func) func() View Codetimer就是一個裝飾器函數(shù),只對一個函數(shù),有一些裝飾作用
裝飾器作用
?不想修改函數(shù)的調(diào)用方式,但還想在原來的函數(shù)前后添加功能
原則
開發(fā)封閉原則
? 開放:對擴(kuò)展是開放的
? 封閉:對修改是封閉的
封版
語法糖
def timmer(f): #裝飾器函數(shù)名def inner():start = time.time()f() #被裝飾的函數(shù)end = time.time()print(end - start)return inner @timmer #語法糖 def func():#被裝飾的函數(shù)time.sleep(0.01)print('fds') # func = timmer(func) func() View Code?
def timmer(f): #裝飾器函數(shù)名def inner():start = time.time()ret = f() #被裝飾的函數(shù)end = time.time()print(end - start)return retreturn inner @timmer #語法糖 def func():#被裝飾的函數(shù)time.sleep(0.01)print('fds')return 'hhh' # func = timmer(func) ret = func() #inner print(ret) #fds # 0.01003718376159668 # hhh View Code裝飾帶參數(shù)函數(shù)的裝飾器
def timmer(f): #裝飾器函數(shù)名def inner(a):start = time.time()ret = f(a) #被裝飾的函數(shù)end = time.time()print(end - start)return retreturn inner @timmer #語法糖 def func(a):#被裝飾的函數(shù)time.sleep(0.01)print('fds',a)return 'hhh' # func = timmer(func) ret = func(1) #inner print(ret) # fds 1 # 0.010416269302368164 # hhh View Code def timmer(f): #裝飾器函數(shù)名def inner(*args,**kwargs):start = time.time()ret = f(*args,**kwargs) #被裝飾的函數(shù)end = time.time()print(end - start)return retreturn inner @timmer #語法糖 def func(a,b):#被裝飾的函數(shù)time.sleep(0.01)print('fds',a,b)return '111'@timmer #語法糖 def func1(a):#被裝飾的函數(shù)time.sleep(0.01)print('fds',a)return '222' # func = timmer(func) ret = func(1,2) #inner ret1 = func1(1) # print(ret,ret1) # fds 1 2 # 0.010915040969848633 # fds 1 # 0.01041555404663086 # 111 222 View Code?
裝飾器的固定模式
def wrapper(func):def inner(*args,**kwargs):ret = func(*args,**kwargs) #被裝飾函數(shù)return retreturn inner() @wrapper #qq = wrapper(qq) def qq():print(123)ret = qq() #相當(dāng)于在執(zhí)行inner() View Code?
def wrapper(func):def inner(*args,**kwargs):print('在被裝飾器之前做的事:')ret = func(*args,**kwargs)print('在被裝飾的函數(shù)執(zhí)行之后做的事:')return retreturn inner@wrapper def h(day):print("gg")return 'tyw'ret = h(3) print(ret) # 在被裝飾器之前做的事: # gg # 在被裝飾的函數(shù)執(zhí)行之后做的事: # tyw View Code def outer(*args,**kwargs):print(args)print(*args)def inner(*args):print('inner',args)inner(*args) outer(1,2,3) # ==outer(#[1,2,3,4]) # (1, 2, 3) # 1 2 3 # inner (1, 2, 3) View Code def wa():'''一個哈哈哈的函數(shù):return:'''print('哈哈哈')print(wa.__name__) #查看字符串的函數(shù)名 print(wa.__doc__) #查看函數(shù)注釋 # wa # # 一個哈哈哈的函數(shù) # :return View Code def wrapper(func): #func = hdef inner(*args,**kwargs):print('在被裝飾器之前做的事:')ret = func(*args,**kwargs)print('在被裝飾的函數(shù)執(zhí)行之后做的事:')return retreturn inner@wrapper def h(day):print("gg")return 'tyw' print(h.__name__)#inner View Codewraps
from functools import wraps def wrapper(func): #func = h @wraps(func)def inner(*args,**kwargs):print('在被裝飾器之前做的事:')ret = func(*args,**kwargs)print('在被裝飾的函數(shù)執(zhí)行之后做的事:')return retreturn inner@wrapper def h(day):print("gg")return 'tyw' print(h.__name__)#h View Code?
帶參數(shù)的裝飾器
import time flag = True 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 retelse:ret = func(*args,**kwargs)return innerreturn timmer @timmer_out(flag) # == timmer = timmer_out(flag)# @timmer def ww():time.sleep(0.1)print('hhh') @timmer_out(flag) def egt():time.sleep(0.1)print('dddgs') flag = False ww() egt() # hhh # 0.10020256042480469 # dddgs # 0.10077428817749023 View Code
?
多個裝飾器裝飾一個函數(shù)
def wapper1(func):def inner1():print('wrap1,bf func')func()print('qrp1,af func')return inner1 def wapper2(func):def inner2():print('wrap2,bf func')func()print('qrp2,af func')return inner2 @wapper2 @wapper1 def f():print('in f') f() # wrap2,bf func # wrap1,bf func # in f # qrp1,af func # qrp2,af func View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/rssblogs/p/10925786.html
總結(jié)
以上是生活随笔為你收集整理的Python学习之路--装饰器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript立体学习指南
- 下一篇: rpm升级时spec文件执行的流程