簡體   English   中英

python裝飾器是否只是裝飾以下函數或下面的所有函數?

[英]Does a python decorator just decorate the following function or all functions beneath?

我有一個如下的類定義:

class myClass(object):
    @lru_cache(maxsize=None)
    def f1(self):
        return 1

    def f2(self):
        return 2

我想知道的是, @lru_cache裝飾器會應用於下面的所有功能,直到遇到另一個裝飾器,還是僅以下函數?

如果要裝飾f2 ,是否還需要在@lru_cache上面重復@lru_cache

您可以通過定義一個裝飾器來輕松地自己測試一下,該裝飾器將告訴您是否裝飾了某些東西。 例如這個:

def myDecorator (f):
    print('Decorated {0}'.format(f.__name__))
    return f

然后,當與您的班級一起使用時:

class MyClass:
    @myDecorator
    def f1 (self):
        return 1

    def f2 (self):
        return 2

…您將獲得以下輸出:

Decorated f1

因此,裝飾器僅應用於直接裝飾的功能。 如果考慮一下,這很有意義,因為沒有語法可以取消修飾函數。 而且,由於您可以將多個裝飾器應用於單個功能,因此也沒有覆蓋裝飾器的概念。

最后,按照Python的禪定“顯式比隱式好” 因此,我們寧願明確為其應應用的每個函數列出裝飾器,而不是隱式地具有以某種魔術方式應用裝飾器的規則,因為它在語法上已經出現過。

裝飾器僅適用於其后的功能,否則,如果我不想裝飾該功能,會發生什么? 因此它們僅適用於以下功能。

因此,如果要緩存它, @lru_cahcef2函數上使用@lru_cahce

除了戳的答案之外,如何看待函數定義的形式語法?

請參閱https://docs.python.org/3/reference/compound_stmts.html#function-definitions

funcdef ::=  [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite

因此,任何修飾函數的修飾符都必須在以def開頭的行之前直接列出。 沒有其他代碼可以在兩者之間跳轉。

暫無
暫無

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

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