python裝飾器 裝飾器工廠函式

2021-09-16 18:41:29 字數 1649 閱讀 4272

使用裝飾器實現如下所示的列印:

***************

***************

小白聯盟

def printequel(func1):

def inner1():

print('='*15)

func1()

return inner1

def printstar(func2):

def inner2():

print('*'*15)

func2()

return inner2

@printequel

@printstar

def myprint():

print("小白聯盟")

myprint()

執行邏輯:

①myprint = printequel(printstar(mystyle))

該步首先相當於是賦值

1)將printequel函式賦值給myprint

2)由於printequel函式的引數func1未知,需先尋找其引數,為函式printstar

3)函式printstar的引數func2 = myprint,已知,則執行printstar函式以得到func1,執行後func1 = inner2

4)知道printequel的引數func1 = inner2後執行printequel,返回inner1,此返回值賦值給myprint

5)執行②

②myprint() #執行該函式

myprint = inner1

1)執行inner1,func1為inner2,inner2中的func2為myprint函式

2)執行結束

def get_celebrator(char):

def print_style(func):

def inner():

print(char*15)

func()

return inner

return print_style

@get_celebrator('=')

@get_celebrator('*')

def myprint():

print("小白聯盟")

myprint()

執行邏輯:

1)首先執行get_celebrator(』=』),執行完後返回print_style,為了區分就叫做print_style1;

2)執行@1的裝飾,由於裝飾需要func引數,未知,故向下尋找func;

3)執行get_celebrator(「 * 」),返回print_style,稱為print_style2;

4)執行完3)返回的是乙個裝飾器,故執行@2的裝飾,即執行稱為print_style2,返回inner2,此引數為myprint;

5)2)中裝飾為完成,現知道func引數,故繼續裝飾@1,返回inner1,此引數為inner2;

6)將inner1賦值給myprint後,執行myprint();

7)執行myprint()即執行inner1。先列印『=』,後執行func函式即inner2,執行inner2先列印『*』後執行func函式即myprint。

8)執行完畢,over。

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裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...