繁体   English   中英

Python装饰器函数执行

[英]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 ,这将不再发生。

Decoratorsmetaclasses是所谓的元编程 (修改/创建代码,来自现有代码)的一部分 这是一个非常迷人的编程方面,需要时间来理解,但提供了惊人的可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM