python裝飾器(步驟詳解)

2022-09-14 01:12:17 字數 2398 閱讀 4727

一、什麼是裝飾器

1、對現有已經實現功能的**進行擴充套件。

2、不用修改被撞時物件的源**和呼叫方法

二、裝飾器的使用

無引數裝飾器:

示例:def zsq(func):

def yz(args):

print("驗證")

return func(args)

return yz

@zsq

def hs(name):

print("我是乙個函式%s"%name)

return "hs fanhuizhi"

ceshi = hs("wz")

print(ceshi)

執行過程:

1、將zsq載入到記憶體中。

2、碰到@zsq,會執行zsq函式將@zaq下的函式當作引數傳入zsq中(相當於zsq(hs))。

3、此時func形參等於hs函式,讀取yz函式到記憶體,return yz函式的記憶體位址到hs函式(@zsq就相當於(hs = zsq(hs)))。

4、此時執行ceshi = hs(「wz」),由於hs被return 回來的yz函式覆蓋,這裡執行的就相當於ceshi = yz(「wz」)。

5、執行yz函式,首先print(「驗證」),然後return func(args),這句return func(args)的意思是執行func函式並把函式的返回值返回給呼叫yz函式的物件,而呼叫yz函式的為ceshi = hs(「wz」),所以這一步就是把返回值傳給hs(「wz」)並賦值給ceshi變數。

6、在這裡執行func(args)由於第三步的時候func等於hs函式所以就相當於執行hs函式。

有引數裝飾器:

示例:def hs1(canshu1, canshu2):

print("第乙個函式")

def hs2(canshu1, canshu2):

print("第二個函式")

def zsq(hs_1, hs_2):

def home(home_func):

def panduan(pd1, pd2):

hs1_return = hs_1(pd1, pd2)

if (hs1_return != none):

return hs1_return

home_return = home_func(pd1, pd2)

if (home_return != none):

return home_return

hs2_return = hs_2(pd1, pd2)

if (hs2_return != none):

return hs2_return

return panduan

return home

@zsq(hs1, hs2)

def index(canshu1, canshu2):

print("index")

index('w','z')

#執行過程

1、直譯器從上往下解釋python**首先將hs1函式載入到記憶體,然後把hs2和zsq函式也加在到記憶體。

2、碰到@zsq(hs1, hs2),直譯器首先會執行zsq(hs1, hs2),把hs1和hs2當作引數傳給zsq賦值給zsq的形參hs_1和hs_2(這裡相當於@zsq = zsq(hs1,hs2))。

3、將home函式載入到記憶體並return給@zsq。

4、執行裝飾器將index函式當作值傳給zsq函式,由於@zsq已被home函式覆蓋這時候相當於執行index = home(index)。

5、讀取panduan函式到記憶體中並把panduan函式的記憶體位址返回給呼叫home函式的index中。

6、執行index(『w』,』z』),由於index被panduan覆蓋這裡就相當於執行panduan(『w』,』z』)。

7、執行panduan函式中的**(不再贅述…)

三、裝飾器語法:

被裝飾函式的正上方,單獨一行

@deco1

@deco2

@deco3

def foo():

pass

foo=deco1(deco2(deco3(foo)))

四、裝飾器補充:wraps

from functools import wraps

def deco(func):

@wraps(func) #加在最內層函式正上方

return func(*args,**kwargs)

@deco

def  index():

'''哈哈哈哈'''

print('from index')

print(index.__doc__)

python裝飾器 python 裝飾器詳解

def outer x def inner y return x y return inner print outer 6 5 11 如 所示,在outer函式內,又定義了乙個inner函式,並且inner函式又引用了外部函式outer的變數x,這就是乙個閉包了。在輸出時,outer 6 5 第乙個...

python裝飾器詳解 python裝飾器詳解

按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的 段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其 時,可以使用裝飾器。先來看乙個簡單的例子 def func1 functio...

詳解Python裝飾器

裝飾器的難點 在梳理了裝飾器的整個內容之後,我認為難點不是裝飾器本身,而是直接呼叫被裝飾的函式,讓人無法理解背後究竟發生了什麼。一 引出裝飾器概念 引入問題 定義了乙個函式,想在執行時動態的增加功能,又不想改動函式本身的 示例 希望對下列函式呼叫增加log功能,列印出函式呼叫 def f1 x re...