2024-06-07 05:24:40 发布
网友
在Python中,使用同一个修饰符带括号和不带圆括号有什么区别?在
例如:
无括号:
@some_decorator def some_method(): pass
带括号:
第一个代码片段中的some_decorator是一个常规修饰符:
some_decorator
相当于
另一方面,第二个代码片段中的some_decorator是一个可调用的函数,它返回一个修饰符:
@some_decorator() def some_method(): pass
some_method = some_decorator()(some_method)
正如邓肯在评论中指出的那样,一些装饰师被设计成两种工作方式。下面是这种decorator的基本实现:
def some_decorator(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'
^{}是一个更复杂的例子。在
简而言之,decorator允许向函数组和类组添加丰富的特性,而不需要对它们进行任何修改。在
要理解@some_decorator和{}之间的区别,关键在于前者是decorator,而后者是返回decorator的函数(或可调用函数)。在
@some_decorator
我认为,看到每个案例的实施有助于理解差异:
def some_decorator(func): def wrapper(func): return func(*args, **kwargs) return wrapper
应用程序:
等价性:
some_method = some_decorator(some_method)
@some_decorator()
def some_decorator(): def decorator(func): def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper return decorator
注意,现在更容易看到@some_decorator()是返回装饰器的函数,而{}只是一个装饰器。请记住,有些装饰师是双向工作的。在
所以现在你可能想知道为什么我们有这两种情况,而前一种版本似乎更简单。答案是,如果您想将参数传递给decorator,那么使用@some_decorator()将允许您这样做。让我们看看一些实际的代码:
def some_decorator(arg1, arg2): def decorator(func): def wrapper(*args, **kwargs): print(arg1) print(arg2) return func(*args, **kwargs) return wrapper return decorator
@some_decorator('hello', 'bye') def some_method(): pass
some_method = some_decorator('hello', 'bye')(some_method)
注意:我认为值得一提的是,decorator可以作为函数或类实现。有关详细信息,请查看this。在
在使用arg inside decorator时,一些实际工作的代码:
def someDecorator(arg=None): def decorator(func): def wrapper(*a, **ka): if not callable(arg): print (arg) return func(*a, **ka) else: return 'xxxxx' return wrapper if callable(arg): return decorator(arg) # return 'wrapper' else: return decorator # ... or 'decorator' @someDecorator(arg=1) def my_func(): print('aaa') @someDecorator def my_func1(): print('bbb') if __name__ == "__main__": my_func() my_func1()
输出为:
第一个代码片段中的
some_decorator
是一个常规修饰符:相当于
^{pr2}$另一方面,第二个代码片段中的
some_decorator
是一个可调用的函数,它返回一个修饰符:相当于
正如邓肯在评论中指出的那样,一些装饰师被设计成两种工作方式。下面是这种decorator的基本实现:
^{} 是一个更复杂的例子。在
简而言之,decorator允许向函数组和类组添加丰富的特性,而不需要对它们进行任何修改。在
要理解}之间的区别,关键在于前者是decorator,而后者是返回decorator的函数(或可调用函数)。在
@some_decorator
和{我认为,看到每个案例的实施有助于理解差异:
@some_decorator
应用程序:
^{pr2}$等价性:
@some_decorator()
应用程序:
等价性:
注意,现在更容易看到}只是一个装饰器。请记住,有些装饰师是双向工作的。在
@some_decorator()
是返回装饰器的函数,而{所以现在你可能想知道为什么我们有这两种情况,而前一种版本似乎更简单。答案是,如果您想将参数传递给decorator,那么使用
@some_decorator()
将允许您这样做。让我们看看一些实际的代码:应用程序:
等价性:
注意:我认为值得一提的是,decorator可以作为函数或类实现。有关详细信息,请查看this。在
在使用arg inside decorator时,一些实际工作的代码:
输出为:
^{pr2}$相关问题 更多 >
编程相关推荐