python當中的裝飾器

2022-03-26 06:49:55 字數 2812 閱讀 6844

首先我們來說一下乙個軟體的設計原則:開閉原則,又被稱為開發封閉原則,你的**對功能的擴充套件是開放的,你的程式對修改源**是封閉的.這樣的軟體設計思路可以更好的維護和開發.

開放:對功能擴充套件開放

封閉:對修改**封閉

接下來我們看裝飾器.首先我們先模擬一下女媧造人.

def  create():

print('女媧很厲害,捏個泥人吹口氣就成了人')

create_people()

現在我們讓這個函式加個澆水功能.

def  create():

print('澆水')

print('女媧很厲害,捏個泥人吹口氣就成了人')

create_people()

但是,現在就違反了開閉原則,如果每次要新增新功能,那這樣就等於是修改了源**.因為開閉原則對修改是封閉的,那怎麼辦,我們可以這樣做

def water():

print('先澆水')

create()

water()

這樣做的問題是.函式寫好了,重新建立了這個函式,在這之前訪問過這個函式的人必須要修改**來訪問新的函式water(),所以現在就用到了裝飾器,裝飾器的作用就是在不修改原有**的基礎上,給函式擴充套件功能

def create_people():

print('女媧很厲害隨隨便便就造人')

def water(fn):

def inner():

print('澆澆水')

fn()

print('施肥')

return inner

# # create_people() # 這個就不行了.

# warter() # 訪問澆水就好了

# func = water(create_people)

# func() # 有人問了. 下游訪問的不不依然是func麼, 不不還是要改麼?

create_people = water(create_people)

create_people() # 這回就好了吧

說一下執行流程:

結論: 我們使用water函式把create_people給包裝了一下. 在不修改create_people的前提下.

完成了對create_people函式的功能新增

下面我們給出裝飾器的完整模型**

def inner(*args,**kwargs): # 為了目標函式的傳參

'''這裡是執行函式前的內容'''

ret = fn(*args,**kwargs) # 呼叫目標函式,ret是目標函式的返回值

'''這裡是執行目標函式後的內容

return ret # 把目標函式的返回值返回.保證函式正常的結束

return inner

def func():

print('我是目標函式")

func() # 呼叫目標函式

執行步驟:    

下面是裝飾器傳參的通用寫法

def inner(*args,**kwargs):

if flag == true:

'''執行目標函式前的位置'''

ret = fn(*args,**kwargs)

'''執行目標函式後的位置'''

return ret

else:

ret = fn(*args,**args)

return ret

return inner

def func():

print('這裡是目標函式')

func()

def inner(*args,**kwargs):

print('111')

ret = fn(*args,**kwargs)

print('222')

return inner

def inner(*args,**kwargs):

print('333')

ret = fn(*args,**kwargs)

print('444')

return inner

def inner(*args,**kwargs):

print('555')

ret = fn(*args,**kwargs)

print('666')

return inner

def eat():

print('我想吃水果')

裝飾器裝飾的函式名字會變為inner,為了讓裝飾的函式名還原,我們用到了@wraps,這樣列印出的函式名就還是原來的函式名了,要引入functools模組

from functools import wraps # 可以改變乙個函式的名字, 注釋...

@wraps(fn) # 把inner的名字改變成原來的func

def inner(*args, **kwargs):

print("前")

ret = fn(*args, **kwargs)

print("後")

return ret

return inner

def func():

print('哈哈哈')

print(func.__name__) # func

python裝飾器 Python 裝飾器

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

python裝飾器 裝飾器

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

python裝飾器原理 Python裝飾器原理

裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...