[英]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_cahce
在f2
函數上使用@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.