首頁>Club>
3
回覆列表
  • 1 # 科級雞

    官方文件的解釋如下

    Python 2.2 extended Python"s object model by adding static methods and class methods, but it didn"t extend Python"s syntax to provide any new way of defining static or class methods. Instead, you had to write a statement in the usual way, and pass the resulting method to a or function that would wrap up the function as a method of the new type.

    大意是為了防止定義方法之後忘記將函式傳遞給另一個以方法作為引數的方法,可以在方法前加上裝飾器,方法在定義完之後自動被裝飾器指向的方法改變行為,以下兩段程式碼用和不用裝飾器的作用是完全相同的,

    @A def f (): ...def f(): ...f=A(f)

  • 2 # 武漢朝夕教育科技

    理解Python裝飾器(Decorator)

    Python裝飾器看起來類似Java中的註解,然鵝和註解並不相同,不過同樣能夠實現面向切面程式設計。

    想要理解Python中的裝飾器,不得不先理解閉包(closure)這一概念。

    閉包

    看看維基百科中的解釋:

    在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函式閉包(function closures),是引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。

    官方的解釋總是不說人話,but--talk is cheap,show me the code:

    是一個區域性變數,在函式執行之後應該就不會存在了。但是巢狀函式引用了這個變數,將這個區域性變數封閉在了巢狀函式中,這樣就形成了一個閉包。

    結合這個例子再看維基百科的解釋,就清晰明瞭多了。閉包就是引用了自有變數的函式,這個函式儲存了執行的上下文,可以脫離原本的作用域獨立存在。

    下面來看看Python中的裝飾器。

    裝飾器

    一個普通的裝飾器一般是這樣:

    這樣就定義了一個打印出方法名及其引數的裝飾器。

    呼叫之:

    輸出:

    裝飾器在使用時,用了語法,讓人有些困擾。其實,裝飾器只是個方法,與下面的呼叫方式沒有區別:

    語法只是將函式傳入裝飾器函式,並無神奇之處。

    值得注意的是,這是python提供的裝飾器。它能把原函式的元資訊複製到裝飾器裡面的 func 函式中。函式的元資訊包括docstring、name、引數列表等等。可以嘗試去除,你會發現的輸出變成了wrapper。

    帶引數的裝飾器

    裝飾器允許傳入引數,一個攜帶了引數的裝飾器將有三層函式,如下所示:

    看到這個程式碼是不是又有些疑問,內層的decorator函式的引數func是怎麼傳進去的?和上面一般的裝飾器不大一樣啊。

    其實道理是一樣的,將其語法去除,恢復函式呼叫的形式一看就明白了:

    輸出結果與正常使用裝飾器相同:

    至此,裝飾器這個有點費解的特性也沒什麼神秘了。

    裝飾器這一語法體現了Python中函式是第一公民,函式是物件、是變數,可以作為引數、可以是返回值,非常的靈活與強大。

  • 中秋節和大豐收的關聯?
  • 貓咪肚子大是不是要生貓仔了?