Skip to main content

装饰器

基础实现

相当于在一个函数的执行前后添加钩子处理函数,python官方封装了一个语法糖

  • 实现原理
# 原始函数
def old_func():
pass

# 创建一个装饰器函数
def detector(func):
def run(*args, **key):
# 需要在func前运行的代码

return func(*args, **key)

# 在func运行后执行的代码

return run
  • 原始用法
new_feat = detector(old_func)
new_feat()
  • 装饰器用法
@detector
def old_func():
pass

修复 __name____doc__

由于装饰器返回了新的包装函数,导致魔术方法 __name____doc__ 指向了新函数,需要修复该特性,可以使用 functoolswraps工具

from functools import wraps

# 原始函数
def old_func():
pass

# 创建一个装饰器函数
def detector(func):
@wraps(func)
def run(*args, **key):
# 需要在func前运行的代码

return func(*args, **key)

# 在func运行后执行的代码
return run

@detector
def old_func():
pass
# name 和 doc都会被修复
print(old_func.__name__) # >>> run

让装饰器带上参数

只要在原装饰器上再套一层需要参数的函数,即可实现

# 定义装饰器
def decorator(value):
def f(func):
@wraps(func)
def run(*args, **key):
return func(*args, **key)
return run
return f
# 使用
@decorator('xxxx')
def old_func():
pass

相关文献