python中的函数修饰器

python中的函数修饰器 – @wrapper

简介

类似于C#的属性、Java的注解,python也有对应的修饰符。从Python2.7和Python3开始,提供了以’@’为标示的修饰符,可以在模块或者类的定义层次内对函数进行修饰。

定义形式

修饰符定义出现在函数定义的前一行,不允许和函数定义在同一行;并且支持多个修饰符,每行一个。

decorator      ::=  "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
dotted_name    ::=  identifier ("." identifier)*

使用

  一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的函数对象。
而且,函数修饰符可以如下形式嵌套.

@f1(arg)
@f2
def func(): pass

这相当于如下代码:


def func(): pass

func = f1(arg)(f2(func))

示例

示例1–简单的decorator

# encoding=utf-8
"""
python decorator sample
    简单的python修饰符示例
"""
## 定义的decoration 处理函数
def ann1(fn):
    def samplejob(*args):
        print("ann1's sample job.")
        fn(*args)   ## 必须的,否则被修饰的函数不被调用,无法执行了。
    return samplejob


def ann2(fn):
    def _decorator(*args):
        print("ann2:\r\nget params: ")
        for item in args:
            print item
        print("\r\ncalculate result: ")
        fn(*args)   ## 必须的,否则被修饰的函数不被调用,无法执行了。
    return _decorator

@ann1
@ann2
def mult(a,b):
    print(a*b)

if __name__ == "__main__":
    mult(2,5) 


示例2–带参数的decorator

# encoding=utf-8
"""
python decorator sample:
    带参数的python修饰符
"""
## 定义的decoration修饰器及处理函数
def attrs(**kwds):
    def decorate(f):
        ## 可以访问传入的参数kwds
        print "decorate attr: ", len(kwds)
        for k in kwds:
            # def setattr(object, name, value):
            #   Set a named attribute on an object; setattr(x, 'y', v) is equivalent to `x.y = v''.
            setattr(f, k, kwds[k])  

        return f

    return decorate


@attrs(versionNeeded="2.7",
       author="David",
       dt="2018-01-01")
def test_method(f):
    # def getattr(object, name, default)
    #   getattr(object, name[, default]) -> value
    print(getattr(test_method,'versionNeeded',0))
    print(getattr(test_method,'author','none'))
    print(getattr(test_method,'dt','2000-01-01'))

    print 'working with param:', f

if __name__ == "__main__":
    test_method(8)   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值