首先,函数名表示函数类型的变量。
装饰器是一个函数,参数是函数,返回值是函数。
-
装饰器原理
def log(f): # 装饰器函数
"""
:param f: 接收一个函数
:return: 返回一个函数
"""
def fix():
f() # 调用函数
print('再睡5分钟')
return fix
def take_a_nap(): # 被装饰函数
print('小憩')
if __name__ == '__main__':
print(take_a_nap) # take_a_nap是函数类型变量
take_a_nap = log(take_a_nap) # 调用log函数,返回值覆盖原来take_a_nap的值
print(take_a_nap)
take_a_nap() # 调用函数
运行结果:
<function take_a_nap at 0x00000159001BB130>
<function log.<locals>.fix at 0x00000159001BB1C0>
小憩
再睡5分钟
-
改成装饰器写法
@log # @后面跟的是装饰器函数名,不是调用
def take_a_nap(): # 被装饰函数
print('小憩')
if __name__ == '__main__':
print(take_a_nap)
take_a_nap()
运行结果:
<function log.<locals>.fix at 0x000001E3C57BB1C0>
小憩
再睡5分钟