python - 在定义另一个函数的 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
.
解决方案
@log
在函数定义之前使用(或其他一些装饰器)将以被装饰函数作为参数调用装饰器函数(log
在这种情况下),并将被装饰函数替换为装饰器函数返回的函数,即类似于做now = log(now)
之后函数的初始声明。
因此,“短”版本将在函数被修饰时打印一次“调用”行,然后返回函数本身。另一方面,“长”版本每次调用函数时都会打印“调用”行,方法是返回一个包装原始函数的新函数并进行日志记录。
您的输出是相同的,因为您在装饰后立即调用该函数一次。
推荐阅读
- java - 11111111111111111111111111111110 如何评估为-2?
- javascript - javascript if 语句返回值
- php - 最近 5 天之前的付款待处理通知显示 Php mysqli
- ios - iOS Core蓝牙无法通过特性传输数据
- c# - 从句柄渲染 Windows 中控件的图像
- scala - TestProbe 没有收到来自 RouteSpec 的消息
- json - 具有不同“显示名称”的两个文件夹的相同 ID
- javascript - 无法正确获取 localStorage 中存储的数据
- java - 在业务逻辑层传递数据
- converters - 将 txt 转换为 md,将 unix enf-of-line 更改为双倍空格