裝飾器本質也是乙個函式, 只不過這個函式需要遵循以下規則:
(*args, **kwargs):
以滿足所有函式需要
之後通過@語法糖即可裝飾到任意函式上
# 不帶引數的裝飾器
def pre_do_sth(func):
print("do sth before call one")
func(*args, **kwargs)
@pre_do_sth
def echo(msg):
print(msg)
echo("hello world")
do sth before call one
hello world
只需要寫乙個返回 裝飾器(入參只有乙個, 返回值是乙個函式)函式的函式
同樣也能利用@語法糖
# 帶引數的裝飾器
def pre_do_sth_2(msg):
def decorator(func):
print("do sth before call two, print:%s"%(msg))
func(*args, **kwargs)
return decorator
@pre_do_sth_2("foo")
def echo(msg):
print(msg)
echo("hello world")
實際上@後面並不是對pre_do_sth_2這個函式生效 而是對pre_do_sth_2的返回值生效
do sth before call two, print:foo
hello world
先宣告的裝飾器先執行, 即在最外層
# 不帶引數的裝飾器
def pre_do_sth(func):
print("do sth before call one")
func(*args, **kwargs)
# 帶引數的裝飾器
def pre_do_sth_2(msg):
def decorator(func):
print("do sth before call two, print:%s"%(msg))
func(*args, **kwargs)
return decorator
@pre_do_sth
@pre_do_sth_2("foo")
def echo(msg):
print(msg)
echo("hello world")
do sth before call one
do sth before call two, print:foo
hello world
python裝飾器原理 Python裝飾器原理
裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...
python中裝飾器的原理及用法
要想理解python中裝飾器的原理首先要明白一下兩點 2 裝飾器的的作用等價於callfucn decfucn callfucn 這兩點在後期的分析中要牢牢的記住。以一段 為例 def decofun func def deco a,b print before callfunc called.fu...
Python裝飾器原理分析和案例
裝飾器部分 裝飾器是可呼叫的物件,其引數是另乙個函式 被裝飾的函式 裝飾器可能會處理被裝飾的函式,將它返回 或者將其替換成另乙個函式或者可呼叫的物件。decorate def target print running target 以上例子,通過裝飾器之後,實際執行的是如下方法 def target...