Python装饰函数执行
我有下面的decorator演示代码。如果我在没有显式调用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):
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之外,在编译时是否还调用了任何对象?是的,元类也会在编译时修改它们正在“元分类”的类,而不是在运行时。元类和装饰器在某种程度上类似于代码黑客,因为它们修改它们各自的元类或装饰代码,而不必修改初始代码本身。然后,每当调用这个“现在代码”时,新的黑客行为就会发生。