當使用相同的裝飾器有或沒有括號時有什麼區別Python
?例如:使用python裝飾器有無括號
沒有括號
@someDecorator
def someMethod():
pass
在第一代碼段括號
@someDecorator()
def someMethod():
pass
當使用相同的裝飾器有或沒有括號時有什麼區別Python
?例如:使用python裝飾器有無括號
沒有括號
@someDecorator
def someMethod():
pass
在第一代碼段括號
@someDecorator()
def someMethod():
pass
someDecorator
是常規裝飾:
@someDecorator
def someMethod():
pass
相當於
someMethod = someDecorator(someMethod)
在另一方面,在第二代碼段someDecorator
是返回一個裝飾可調用:
@someDecorator()
def someMethod():
pass
相當於
someMethod = someDecorator()(someMethod)
如在評論中指出通過鄧肯,一些裝飾者被設計成雙向工作。這裏是一個非常基本實現這樣的裝飾的:
def someDecorator(arg=None):
def decorator(func):
def wrapper(*a, **ka):
return func(*a, **ka)
return wrapper
if callable(arg):
return decorator(arg) # return 'wrapper'
else:
return decorator # ... or 'decorator'
pytest.fixture
是一個更爲複雜的例子。
這些不是大括號,而是括號。大括號是'{}'。 –
@DanielRoseman很好的提示,經常找到正確的單詞... – BendEg
下面的很好的答案。值得指出的是,不同之處在於'foo'和'foo()'*之間的區別*,包括不在裝飾器中。 –