[英]Python decorator function execution
我有下面的装饰演示代码。 如果我在没有显式调用greet
函数的情况下执行它,它就会在decorator函数中执行print
语句并输出Inside decorator
。
我无法理解装饰器的这种行为。 即使我没有调用greet
函数,如何调用time_decorator
?
我正在使用Python 3。
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)
time_decorator
是功能装饰期间执行。 wrapper
不是(这是调用装饰的greet()
时调用的函数)。
@
只是语法糖。 以下代码片段是等效的。
装饰器语法:
@time_decorator
def greet(name):
return 'Hello {0}'.format(name)
显式装饰过程 - 装饰器是一个基于另一个返回新功能的函数。
def greet(name):
return 'Hello {0}'.format(name)
greet = time_decorator(greet)
装饰器在启动时调用(当python解释器在程序启动时读取代码) ,而不是在运行时 (实际调用装饰函数时) 。
在运行时,它是被调用的包装函数wrapper
,它自己调用装饰函数并返回其结果。
因此,执行print
行是完全正常的。
如果,即装饰10个功能,您将看到10倍的打印输出。 甚至不需要调用装饰函数来实现这一点。
移动print
内部wrapper
,这将不再发生。
Decorators
和metaclasses
是所谓的元编程 (修改/创建代码,来自现有代码)的一部分 。 这是一个非常迷人的编程方面,需要时间来理解,但提供了惊人的可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.