簡體   English   中英

Python裝飾器-參數從何而來?

[英]Python decorators - Where do parameters come from?

我已經閱讀了這個問題可接受的答案。

引用:

def overrides(interface_class):
    def overrider(method):
        assert(method.__name__ in dir(interface_class))
        return method
    return overrider

但是,如果我重寫任意方法,我仍然不確定參數method來源。

我將嘗試解釋到目前為止我所了解的內容:

  1. 外部函數從裝飾器的符號獲取其參數。 裝飾器獲得一個參數,即接口,從該參數中獲得要覆蓋的方法。
  2. 裝飾器的結果是一個 function ,它將替換我們用該裝飾器裝飾的功能。
  3. assert語句檢查我們要覆蓋的方法是否確實存在於我們作為參數給出的接口中。 這就是實際用途,因為現在我們不能覆蓋不存在的方法。 如果我們仍然嘗試這樣做,那么我們將有一個失敗的斷言。

但是我仍然不知道參數method來自何處,為什么它始終是我們要覆蓋方法的類的方法而不是實例的實例。 類的方法通常將self作為參數,並引用實例,這是錯誤的嗎?

我也閱讀了這個網站。 就像在他們的示例中一樣,裝飾器必須采用與裝飾函數所采用的相同的參數。

那么,為什么我們突然將方法而不是類作為參數呢?

編輯#1:此網站上,我找到了一些示例,其中外部函數接收將要修飾的函數,而不是該函數或修飾符的參數。 裝飾者如何工作的邏輯似乎取決於條件,無論裝飾是否有參數。 但是這些規則是什么?

該網站的示例:

def pass_thru(func_to_decorate):
    def new_func(*original_args, **original_kwargs):
        print "Function has been decorated.  Congratulations."
        # Do whatever else you want here
        return func_to_decorate(*original_args, **original_kwargs)
    return new_func


# Notice nothing here now
def print_args(*args):
    for arg in args:
        print arg


# Notice the change here
pass_thru(print_args)(1, 2, 3)

您的第二點無效:

  1. 裝飾器的結果是一個function ,它將替換我們用該裝飾器裝飾的功能。

從技術上講, overrides將返回裝飾器以用於該方法。 代替

class Class(object):
    @overrides(Interface)
    def method(self):
        pass

你可以寫

class Class(object):
    overrider = overrides(Interface)
    @overrider
    def method(self):
        pass

正如您在裝飾者動機中發現的那樣,您將擁有與

class Class(object):
    def method(self):
        pass
    method = overrides(Interface)(method)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM