Python基礎 44 裝飾器詳解

2021-09-23 10:23:10 字數 3792 閱讀 5590

裝飾器的簡單功能在前面已經有過介紹(裝飾器基礎),本篇詳細介紹一下裝飾器的作用

**部分:

# 在每個函式執行前列印出執行的函式名稱

def print_log(func):

print("當前執行的函式名為:",func.__name__)

func()

@print_log

def send_word():

print("正在執行send_word函式")

@print_log

def send_video():

print("正在執行send_video函式")

send_word()

send_video()

執行結果:

**部分:

# 操作的前提需要登入,必須輸入正確的name和pwd才可以繼續執行func

def login(func):

if name == "admin" and pwd == "123456":

print("登入成功,可以繼續操作!!")

func() # 3.func()等同於send_word(),這裡會執行send_word函式

else:

print("還未成功登入,不能操作")

def send_word():

print("這是發布的內容")

send_word("admin","123456")

執行結果:

帶引數組,是因為不確定每個被裝飾函式的引數個數,一般會用引數組來傳參

在第乙個demo的基礎上優化一下

**部分:

# 在每個函式執行前列印出執行的函式名稱

def print_log(func):

print("當前執行的函式名為:",func.__name__)

func(*args, **kwargs)

@print_log

def send_word(*args, **kwargs):

print("正在執行send_word函式,輸出結果:{}",(args,kwargs))

@print_log

def send_video(*args, **kwargs):

print("正在執行send_video函式,輸出結果:",(args,kwargs))

send_word("suner","wang")

send_video(name="suner",age=20)

執行結果:

上面的裝飾器預設只能傳遞乙個func引數,假設我們需要裝飾器實現不同的裝飾效果,可以在外層再封裝一下

**部分:

def print_log(category):

def decorator(func):

if category == "func_name":

print("當前執行的函式名為:", func.__name__)

elif category == "func_dir":

print("當前執行的函式dir為:", func.__dir__)

return func(*args,**kwargs)

return decorator

@print_log("func_name") # 相當於@decorator

def send_word(*args, **kwargs):

print("正在執行send_word函式,輸出結果:",(args,kwargs))

@print_log("func_dir") # 相當於@decorator

def send_video(*args, **kwargs):

print("正在執行send_video函式,輸出結果:",(args,kwargs))

send_word("suner","wang")

send_video(name="suner",age=20)

執行結果:

裝飾器可以是乙個函式,也可以是乙個類

使用類裝飾器主要依靠類的__call__方法,當使用 @ 形式將裝飾器附加到函式上時,就會呼叫此方法。

**部分:

class printlog():

def __init__(self,func):

self.func = func

def __call__(self, *args, **kwargs):

print("當前執行的函式名為:", self.func.__name__)

self.func(*args, **kwargs)

@printlog

def send_word(*args, **kwargs):

print("正在執行send_word函式,輸出結果:",(args,kwargs))

send_word("suner",20)

執行結果:

**部分:

def decorator_001(func):

print("-----001-----")

print("這是001裝飾器")

func(*args,**kwargs)

def decorator_002(func):

print("-----002-----")

print("這是002裝飾器")

func(*args,**kwargs)

def decorator_003(func):

print("-----003-----")

print("這是003裝飾器")

func(*args,**kwargs)

@decorator_001

@decorator_002

@decorator_003

def send_word(*args, **kwargs):

print("正在執行send_word函式,輸出結果:",(args,kwargs))

send_word("suner",20)

執行結果:由列印的003~001可以看出多個裝飾器之間的執行順序是從裡往外執行的,至於為什麼先列印001裝飾器這裡可能就涉及到底層的知識了,解釋不來,我們只需要知道是按這樣乙個順序執行的即可

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...