如何真正的了解python裝飾器

2022-10-04 09:06:05 字數 2409 閱讀 9566

合理使用裝飾器可以簡化開發,並且使得**更加清晰。下面我們分別介紹兩種裝飾器,不帶引數的裝飾器和帶引數的裝飾器。

一、不帶引數的裝飾器

我們用乙個實際的例子來引入裝飾器的概念,比如我們現在有乙個方法a(),然後我們需要在方法a()執行之前在終端列印"function is running",這時候我們可以在方法a()的開始部分加上下面的**:

print("function is running")

但是如果我們不想修改方法a()mylluzekmr的**,也可以重新寫乙個方法decorator(),然後把a()作為入參,**如下:

def decorator(fun):

@functools.wraps(fun)

def wrapper(*args, **kwargs):

print("method is running")

return fun()

return wrapper

python中的方法可以作為引數傳入另乙個方法,所以當我們執行decorator(a)的時候,返回的是乙個方法,這個方法的本質是先執行print語句,然後再執行a()。

但是這樣我們的呼叫**就需要進行修改,也就是說之前呼叫方法a(),現在的寫法是呼叫decorator(a)(),為了不影響呼叫的**,我們使用python的語法糖改造方法a()的**。

@decorator

def a():

程式設計客棧; # do something

實際上只是在a()的前面加上一行@decorator,這樣在我們的呼叫**就不需要改變了。

裝飾器中的@functools.wraps(fun)是為了保證返回的方法__name__屬性和入參方法fun的__name__屬性相同。

二、帶入參的裝飾器

在上面不帶引數的裝飾器中,我們實現了在執行方法a()之前列印一行固定的字串,如果我們想要列印不同的字串就需要用帶引數的裝飾器。實際上就是在不帶引數的裝飾器上再封裝一層即可,**如下:

def decorator_par(name):

def decorator(fun):

@functools.wraps(fun)

def wrapper(*args, **kwargs):

程式設計客棧         print("method {} is running".format(name))

return fun()

return wrapper

return decorator

這樣我們就可以在使用裝飾器的時候設定引數name,實現列印不同的資訊。完整的**如下:

import functools

def decorator_par(name):

def decorator(fun):

@functools.wraps(fun)

def wrapper(*args, **kwargs):

print("method {} is running".format(name))

return fun()

return wrapper

return decorator

@decorator_par("a")

def a():

print("i&n程式設計客棧bsp;am a")

@decorator_par("b")

def b():

print("i am b")

a()b()

執行輸出為:

method a is running

i am a

method b is running

i am b

可以看到我們在不改變方法呼叫**的情況下,實現了在該方法之前列印特定的資訊。

以上就是裝飾器的兩種實現示例,實際開發中也可以將多個裝飾器進行巢狀,可以實現更加複雜的需求。

內容擴充套件:

python函式式程式設計之裝飾器

1.開放封閉原則

簡單來說,就是對擴充套件開放,對修改封閉。

在物件導向的程式設計方式程式設計客棧中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段**被修改,受到影響的地方就會有很多,此時很容易因為乙個小地方的修改而影響整套系統的崩潰,所以對於現代程式開發行業來說,一套系統一旦上線,系統的源**就一定不能夠再改動了。然而一套系統上線以後,隨著使用者數量的不斷增加,一定會為一套系統擴充套件新增新的功能。

此時,又不能修改原有系統的源**,又要為原有系統開發增加新功能,這就是程式開發行業的開放封閉原則,這時就要用到裝飾器了。

2.什麼是裝飾器

裝飾器,顧名思義,就是裝飾,修飾別的物件的一種工具。

所以裝飾器可以是任意可呼叫的物件,被裝飾的物件也可以是任意可呼叫物件。

3.裝飾器的作用

在不修改被裝飾物件的源**以及呼叫方式的前提下為被裝飾物件新增新功能。

python裝飾器了解

功能 在不修改原始碼和原有呼叫方式的情況下給函式新增額外功能 又成為語法糖,包裝函式 如要在函式的前面,後面新增新的功能,或更改函式的功能 如下面的例子,有個talk,列印名字,現在想要包裝下,讓列印時說的是 name love you 又不想直接懂函式talk,就加上decorator def l...

裝飾器的簡單了解

1.抽象元件 需要裝飾的抽象物件介面或者抽象父類。2.具體元件 需要裝飾的物件 3.抽象裝飾類 包含了對抽象元件的引用以及裝飾者共有的方法 4.具體的裝飾類 被裝飾的物件。public class decoratetest 1.抽象元件 inte ce drink 2.具體元件 class coff...

python如何裝飾遞迴函式

裝飾函式printtime 列印遞迴函式執行時間 def printtime func wraps func def args,kwargs start time print func args,kwargs end time print spent time s end start 遞迴函式n d...