python裝飾器三種裝飾模式的簡單分析

2022-09-29 12:33:14 字數 2286 閱讀 8371

學設計模式中有個裝飾模式,用j**a實現起來不是很難,但是遠遠沒有python簡單,難怪越來越火了!

這裡就簡單討論下python的幾種裝飾模式:

一 無參裝飾器:

# 裝飾器

import time

# 裝飾器,記錄函式執行時間

def decorator01(fun):

def wapper():

stime = time.time()

fun()

etime = time.time()

print("fun run time is ".forma - stime))

return wapper # 必須要返回乙個函式的記憶體位址

# 使用裝飾器裝飾某個函式,等價於 test01=decorator01(test01),

# 即將test01實際引用變成wapper函式記憶體位址,所以執行test01實際是執行wapper

@decorator01

def test01():

time.sleep(2)

print("test01 is running")

test01() # 不修改**和呼叫方式,實現新增記錄時間功能

二 函式帶參裝飾器:

#程式設計客棧 裝飾器

import time

# 裝飾器,記錄函式執行時間

def decorator01(fun):

def wapper(*args, **kwargs): # 使用非固定引數,無論引數是什麼,都可以傳遞進來

stime = time.time()

fun(*args, **kwargs)

etime = time.time()

print("fun run time is ".format(time=etime - stime))

return wapper # 必須要返回乙個函式的記憶體位址

# test01() = wapper(), 程式設計客棧所以裝飾器加引數是給巢狀函式加引數

@decorator01

def test01(args1):

time.sleep(2)

print("引數是 ".format(name=args1))

test01("侯徵") # 不修改**和呼叫方程式設計客棧式,實現新增記錄時間功能

三 裝飾器本身帶引數的裝飾器:

# 裝飾器

import time

# 如果裝飾器有引數,最外層是裝飾器的引數

def decorator01(*args, **kwargs):

print("裝飾器引數:", *args, **kwargs)

def out(fun)ilmyf: #第二層才是接受的函式

def wapper(*args, **kwargs): # 使用非固定引數,無論引數是什麼,都可以傳遞進來

stime = time.time()

fun(*args, **kwargs)

etime = time.time()

print("fun run time is ".format(time=etime - stime))

return wapper # 必須要返回乙個函式的記憶體位址

return out # 要返回裝飾函式的記憶體位址

# 裝飾器本身帶引數,此時 decorator01(arg)=out,即相當於 @out裝飾test01,所以 test01=out(fun)=wapper

@decorator01(1)

def test01(args1):

time.sleep(2)

print("引數是 ".format(name=args1))

test01("侯徵") # 不修改**和呼叫方式,實現新增記錄時間功能

這種一開始挺難理解的,但是只要記住一點,@語法糖裝飾器的作用就是 給被裝飾的函式重新賦乙個函式的記憶體位址,即裝飾器內部定義的那個

和你直接fun01=decorator(fun),然後fun01()是一樣的,只是這樣寫不用改變原來呼叫方式

@decorator

def fun():

即就是fun=decorator(fun)所以,當裝飾器有引數時,還需要返回乙個函式,這個函式才是用來裝飾作用的,decorator(1)=out, 即fun=out(fun)!!

所以外面再包一層就行了,其實就相當於@decorator(1)=@out,即decorator(1)=out,實際裝飾器時out,只不過decorator(1)返回了乙個out 這樣理解就簡單多了 ,無參的@就是起賦值作用

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

類中函式的三種裝飾器

一,property,property裝飾器是用來將類內的函式屬性偽裝成資料屬性 class people def init self,name,weight,height self.name name self.weight weight self.height height property d...