装饰器自动调用

我正在尝试了解脚本中使用修饰符的两个版本背后的逻辑。在脚本之一中,装饰器会自动调用,甚至不会被调用。

脚本1:

def outer_decorator(input_function):
    def decorator(*args,**kwargs):
        print "Outer Decorator Called"
        output = input_function(*args,**kwargs)
        return output

    return decorator


class X:

    @outer_decorator
    def inner_decorator(input_function):
        def decorator(*args,**kwargs):
            output = input_function(*args,**kwargs)
            print "Inner Decorator Called"
            return output

        return decorator


    def z(self,a,b):
        """
        Function returns a - b
        """
        return a - b


x = X()
print(x.z(1,2))

输出

  

-1

因此,每当我运行脚本1时,我都会创建一个class X对象,然后调用函数z。因此,在这种情况下,内部装饰器函数不会在任何地方使用,因此不会被调用。

脚本2:

def outer_decorator(input_function):
    def decorator(*args,**kwargs)
            print "Inner Decorator Called"
            return output

        return decorator

    @inner_decorator
    def s(self,b):
        """
        Function return a + b
        """
        return a + b

    def z(self,2))

因此,现在在上面的脚本中,我介绍了另一个使用function s的{​​{1}}。但是我仍然只调用@inner_decorator中的function z。但是,当我运行此脚本时,会得到以下输出。

  

被称为外部装饰器
  -1

那么为什么class x被调用并正在打印?
是因为在某个地方使用的装饰器是由解释器处理的吗?

xiaoxin_88 回答:装饰器自动调用

之所以调用outer_decorator是因为您正在装饰装饰器本身。

def outer_decorator(input_function):
    def decorator(*args,**kwargs):
        print "Outer Decorator Called"
        output = input_function(*args,**kwargs)
        return output

    return decorator


class X:

    @outer_decorator
    def inner_decorator(input_function):
        def decorator(*args,**kwargs):
            output = input_function(*args,**kwargs)
            print "Inner Decorator Called"
            return output

        return decorator

此表达式@outer_decorator实际上转换为inner_decorator = outer_decorator(inner_decorator),因此尽管您没有显式调用用inner_decorator装饰的函数,但是在您装饰{{1}的那一刻,虽然在代码中}与function s一起实际上调用了inner_decorator的修饰版本,该修饰版本又调用了inner_decorated内部定义的decorator函数。

我希望这可以使事情变得清楚

,

脚本1:

inner_decorator = outer_decorator(inner_decorator) # i.e. a function 
# object,no invocation

脚本2: 在这里:

@outer_decorator
    def inner_decorator(input_function):

这被调用:

inner_decorator = outer_decorator(inner_decorator) # i.e. a function 
# object,no invocation

但是, 在这里:

@inner_decorator
    def s(self,a,b):

这导致:

s = inner_decorator(s) = outer_decorator(inner_decorator)(s) # causes 
# invocation of outer_decorator
本文链接:https://www.f2er.com/3103934.html

大家都在问