zoukankan      html  css  js  c++  java
  • Python装饰器

    装饰器是Python的一个特性,其实就是对callable对象的一个包装。下面是几个例子:

    1.修饰器自身不带有参数,那么AAA的参数就是func

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def AAA(f):
        def wrapper(YYY):
            XXX
            f(YYY)
        return wrapper
     
    @AAA
    def func(OOO):
        XXX

    等价于(默认会执行下面一步,也就是哪怕没有运行的代码,初始化模块的时候也会执行下面代码)

    1
    func = AAA(func)  #func以参数f的形式被AAA调用,同时返回一个callable的对象。

    2.如果修饰器自身带有参数,那么AAA的参数就不是func,func会的被传递到AAA生成的wrapper中,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def AAA(fff):
        print fff
        def wrapper(f):
            def _wrapper(OOO):
                print "_wrapper"
                f(OOO)
            return _wrapper
        return wrapper
     
    @AAA('bbb')
    def func(OOO):
        print OOO

    等价于(其会执行下面一步,也就是哪怕没有运行的代码,初始化模块的时候也会执行下面代码。换句话说AAA(‘bbb’)这个不管你func有没有 被调用都会的执行,而func实际上等价于wrapper(func),wrapper(func)会的返回_wrapper,因此调用 func(XXX)就变成了调用_wrapper(XXX)):

    1
    func = AAA('bbb')(func)

    也就是说,有没有参数对于修饰器来说传递func的时机是不同的,这点务必注意。这点理解过后,func的具体内容就可以自己通过g(f(x))这种来推导了。同时记住,推导的那些代码在模块初始化的时候是铁定会执行的,不管你实际上有没有代码。

    3.如果是作用在class上,那么等价于作用在__init__上,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def AAA(f):
        def wrapper():
            print "AAA"
            f()
        return wrapper
     
    @AAA
    class C():
        def __init__(self):
            print "INIT"
     
    c = C()

    输出是:

    1
    2
    AAA
    INIT
  • 相关阅读:
    我来说说博客评论的事
    SWFUpload+Javascript仿163邮件上传文件
    如何暂停和终止线程
    分享我的数据处理类库,欢迎拍砖
    求数列两两之差,再求和
    poj 1006 中国剩余定理
    Poj算法做题顺序
    poj 1328
    ZOJ 3279
    poj 2352 树状数组
  • 原文地址:https://www.cnblogs.com/zmlctt/p/4208918.html
Copyright © 2011-2022 走看看