Python装饰函数执行

Python装饰函数执行,python,decorator,Python,Decorator,我有下面的decorator演示代码。如果我在没有显式调用greet函数的情况下执行它,它将在decorator函数内执行print语句,并在decorator函数内输出语句 我无法理解装饰师的这种行为。即使我没有调用greet函数,如何调用time\u decorator 我正在使用Python3 def time_decorator(original_func): print('Inside decorator') def wrapper(*args, **kwargs):

我有下面的decorator演示代码。如果我在没有显式调用
greet
函数的情况下执行它,它将在decorator函数内执行
print
语句,并在decorator函数内输出
语句

我无法理解装饰师的这种行为。即使我没有调用
greet
函数,如何调用
time\u decorator

我正在使用Python3

def time_decorator(original_func):
    print('Inside decorator')
    def wrapper(*args, **kwargs):
        start = time.clock()
        result = original_func(*args, **kwargs)
        end = time.clock()
        print('{0} is executed in {1}'.format(original_func.__name__, end-start))
        return result
    return wrapper


@time_decorator
def greet(name):
    return 'Hello {0}'.format(name)

装饰器是在开始时调用的(当python解释器在程序启动时读取代码时),而不是在运行时调用的(当装饰函数实际被调用时)

在运行时,调用的是包装函数
wrapper
,它本身调用修饰函数并返回其结果

因此执行
打印
行是完全正常的

例如,如果您装饰10个功能,您将看到10倍的打印输出。甚至不需要调用修饰函数就可以实现这一点

打印
移动到
包装内
,这样就不会再发生这种情况了


Decorators
以及
元类
是所谓的元编程的一部分(从现有代码修改/创建代码)。这是编程的一个非常吸引人的方面,它需要时间去理解,但提供了惊人的可能性。

time\u decorator
是在函数修饰期间执行的<代码>包装器
不可用(这是在调用修饰的
greet()
时调用的函数)

@
只是语法上的糖分。以下代码段是等效的

装饰器语法:

@time_decorator
def greet(name):
    return 'Hello {0}'.format(name)
显式修饰过程-修饰器是一个基于另一个函数返回新函数的函数

def greet(name):
    return 'Hello {0}'.format(name)

greet = time_decorator(greet)

谢谢@Apero!在编译时调用decorator的动机是什么?除了decorators之外,在编译时是否还调用了任何对象?是的,元类也会在编译时修改它们正在“元分类”的类,而不是在运行时。元类和装饰器在某种程度上类似于代码黑客,因为它们修改它们各自的元类或装饰代码,而不必修改初始代码本身。然后,每当调用这个“现在代码”时,新的黑客行为就会发生。