Python中的Decorator装饰器

Decorator 装饰器

理解decorator(装饰器)的关键, 在于理解在python中函数是第一公民, 并且python中万物皆对象. 函数本身可以作为返回对象, 可以作为操作对象.
装饰器decorator, 就是以@这个特殊操作符, 将它所修饰的函数A以它所指定的函数B来处理, 形成另一个函数C的方式, 其本质上跟Java等语言的注解处理没有两样.
@符号, 在python中可以翻译成这样一句话: 将下面这个函数作为参数, 当它被调用时, 以@符号后面的函数代替它, 并将被装饰函数作为参数传入给装饰器. 相当于重新赋值了被装饰的函数.

举个例子:

@anno1 # 用anno1代替anno2
@anno2 # 用anno2代替anno3
@anno3 # 用anno3代替swap
def swap():
    pass
    
# 以上修饰, 相当于调用了这一句 swap = anno3(anno2(anno1(swap)))
# 因此函数的装饰器都需要以函数作为返回值
# 注意有调用顺序

装饰器当然可以带参数, 带上参数后实际是自动加了一层带参数的调用

@decorator(arg1, arg2)
def func():
    pass
# 相当于 func = decorator(arg1, arg2)(func)
# 因此要求decorator(arg1, arg2)返回的是一个可调用的对象

# 例如定义一个允许任意参数的装饰器

# 接受任意参数的装饰器, 定义方式与一般函数相同
def makeHtmlTag(tag, *args, **kwds):
    def real_decorator(fn):
        css_class = " class='{0}'".format(kwds["css_class"]) if "css_class" in kwds else ""
        def wrapped(*args, **kwds): # 定义一个接受参数的函数, 这个函数用来替代待装饰的函数
            return "<"+tag+css_class+">" + fn(*args, **kwds) + "</"+tag+">"
        return wrapped
    return real_decorator # 返回一个可调用的对象, 以被装饰的函数作为参数
  
@makeHtmlTag(tag="b", css_class="bold_css")
@makeHtmlTag(tag="i", css_class="italic_css")
def hello():
    return "hello world"

Reference

python中的decorator

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 部分细节自己改了点,也加了点自己例子,基本上属于转载。转载出处:https://my.oschina.net/le...
    洛克黄瓜阅读 1,999评论 0 3
  • 本文为《爬着学Python》系列第四篇文章。从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新。 在Pytho...
    SyPy阅读 2,521评论 4 11
  • 自从有了孩子,每个六一都绞尽脑汁选书。理由?我最喜欢书了!——小狮子语录。 今年节前,我和孩子商量了下,过一个不一...
    芳华2019阅读 142评论 0 0
  • 在11班的晚修,收到一本何同学的笔记本,里面密密麻麻的文字,全是他自创自编和想象的各种小说故事情节,主人公就是班里...
    我在枣快乐呀阅读 195评论 0 3
  • 记得最清晰的就是你给我做的饭,每道菜第一口都能让我吃出恬静的味道! 还有时时刻刻都不忘耍酷的自信男! 驾驶员也很帅...
    尚庚世家的美铨阅读 301评论 0 1