使用带或不带括号的python修饰符

2024-06-07 05:24:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,使用同一个修饰符带括号和不带圆括号有什么区别?在

例如:

无括号:

@some_decorator
def some_method():
    pass

带括号:

^{pr2}$

Tags: defdecoratorsomepass修饰符method括号区别
3条回答

第一个代码片段中的some_decorator是一个常规修饰符:

@some_decorator
def some_method():
    pass

相当于

^{pr2}$

另一方面,第二个代码片段中的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

应用程序:

^{pr2}$

等价性:

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()
def some_method():
    pass

等价性:

some_method = some_decorator()(some_method)

注意,现在更容易看到@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()

输出为:

^{pr2}$

相关问题 更多 >