首页 > 解决方案 > 在定义另一个函数的 python 装饰器中会发生什么?

问题描述

今天在学习装饰器的时候有个疑问,看下面两段代码代码1:</p>

def log(func):
    def wrapper(*args,**kw):
        print('call %s():' % func.__name__)
        return func(*args,**kw)
return wrapper

@log
def now():
    print('2018-8-28')

now()

代码2:</p>

def log(func):
    print('call %s():' % func.__name__)
    return func

@log
def now():
    print('2018-8-28')

now()
print(type(now()))

为什么第一个代码定义了多个包装函数?两个代码的输出是一样的。

在代码2中,我使用type了now函数的方法来查看它的类型,结果类型是None.

标签: pythonpython-3.xdecorator

解决方案


@log在函数定义之前使用(或其他一些装饰器)将以被装饰函数作为参数调用装饰器函数(log在这种情况下),并将被装饰函数替换为装饰器函数返回的函数,即类似于做now = log(now)之后函数的初始声明。

因此,“短”版本将在函数被修饰时打印一次“调用”行,然后返回函数本身。另一方面,“长”版本每次调用函数时都会打印“调用”行,方法是返回一个包装原始函数的新函数并进行日志记录。

您的输出是相同的,因为您在装饰后立即调用该函数一次。


推荐阅读