Python装饰器

Python装饰器分两种情况:
1.如果decorator本身不用传入参数的话,只是接受一个函数(当然也可以把接受的函数作为参数,为了区别,我们暂且将他们分开),并返回一个函数的话,当使用@log时即把目标函数接入;
2.如果decorator本身需要传入参数,那我们首先就需要在外层嵌套一个传入参数的接口,然后再接受函数并返回一个函数,内层则就是重复第一种情况,当时用@log('要传入的参数'),log('要传入的参数')就相当于第一种情况的log,也许这样说你还不是很能理解,我把廖大大的代码稍微做一点点改变,只改变下函数的名称:

1. 装饰器本身不用传入参数,只接收函数func

def decorator(func):
@functools.wraps(func)
def wrapper(*args, *kw):
print('call %s():' % func.name)
return func(
args, **kw)
return wrapper

@decorator
def f():
pass

2. 装饰器本身需要传入参数,再接收函数func

def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, *kw):
print('%s %s():' % (text, func.name))
return func(
args, **kw)
return wrapper
return decorator

@log('execute')
def f():
pass

其中第二种情况@log('execute')就是传入了字符串参数的decorator,传入参数之后就完全等同于第一种情况的@decorator,log只是在第一种情况下作为实现传入字符串参数功能的外层,可以发现第二种情况的内层完全和第一种情况相同。线性的把第二种情况展开:首先log()传入字符串参数,然后返回decorator接受目标函数func,返回wrapper,最后wrapper输出内容并运行目标函数。明显传入字符串参数之后完全和第一种情况一致。

其他相关帮助理解资料:
探究functools模块wraps装饰器的用途 - 大道曙光
[译] 12步轻松搞定python装饰器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,...
    chen_000阅读 5,160评论 0 3
  • 一. 有时候我们会有这样需求: 在原有的逻辑前后添加一段逻辑 如: 在增/删/改操作之前检查用户是否登录、某个操...
    元亨利贞o阅读 3,911评论 1 4
  • 一.函数装饰器 1.从Python内层函数说起 首先我们来探讨一下这篇文章所讲的内容Inner Functions...
    软体动物Ai阅读 8,505评论 0 14
  • 虽然人们能利用函数闭包(function clouser)写出简单的装饰器,但其可用范围常受限制。多数实现装饰器的...
    gomibako阅读 4,629评论 0 4
  • 读古代军事诗歌有感…… 这雄浑壮魄瑰丽千古的滔滔历史长河中 也曾有过同样的画面 那点点繁星漆沉如水的深夜 幢幢借昏...
    星海上泛起的光阅读 3,480评论 17 32

友情链接更多精彩内容