python 装饰器

装饰器

装饰器是python的高级语法。它主要是用于对函数、方法或类进行加工包装。装饰器采用@语符号,语法简单,可读性高。

装饰器其实是一个函数,它接受函数、方法或类这些可调用对象(callable)作为参数,返回处理过的函数或类对象。当我们想对一个已经封装好的类或者函数添加其他的操作时可以考虑采用装饰器。

装饰函数和方法

1.不含参数的装饰器

首先,我们定义一个函数用于计算平方。

def add(a):

return a**2

print add(3)

有了基本功能后,我们希望添加其他功能,比如输出一句话。修改代码如下:

def add(a):

    return a**3

 

def deco(fun):

    def newFun(a):

        print ('input :',a)

        return fun(a)

    return newFun

 

add = deco(add)

 

print add(3)

打印结果是:

input : 3

27

现在来分析下函数。

函数deco()接受一个函数fun作为参数,并在自己的函数体中定义一个新的函数newFun,在newFun中,首先增加功能打印信息,然后通过fun(a)调用原来的函数。最后将该新的函数对象返回:return newFun

语句add = deco(add),首先调用deco(add)函数,然后将新的函数对象newFun返回。所以当调用add(3)的时候,实际上是调用函数newFun

这样,我们清楚了,函数deco()作为装饰器对函数add()进行装饰。需要注意的是,装饰器deco()必须返回一个可调用对象,不然被装饰后的函数调用时就不知道调用什么了。

这时我们通过@装饰器实现上面的功能:

def deco(fun):

    def newFun(a):

        print'input :',a

        return fun(a)

return newFun

 

@deco

def add(a):

    return a**3

 

print add(3)

在函数add上面添加@deco即可。

2.含参装饰器

    上面的装饰器默认其后的函数为唯一的参数,如果我们想传入其他的参数,需要在原来的装饰器外面再加一层函数。

def decoMaker(args):

    def deco(fun):

        def newFun(a):

            print'args from decoration is ',args

            print'input :',a

            return fun(a)

        return newFun

    return deco

   

@decoMaker('^_^')

def add(a):

    return a**3

 

print add(3)

需要注意的是,装饰器要返回可调用对象:return deco。可以对一个函数添加多个装饰器。

def decoMaker(args):

    def deco(fun):

        def newFun(a):

            #函数执行体

            print'args from decoration is ',args

            print'input :',a

            return fun(a)

        return newFun

    return deco

 

def decoMakerDoc(args):   

    def decoDoc(func): 

        if func.__doc__ == None : 

            printargs,func.__name__, "has no__doc__, it's a bad habit." 

        else

            print func.__name__, ':', func.__doc__, '.' 

        return func

    return decoDoc

 

@decoMakerDoc('T_T')

@decoMaker('^_^')

def add(a):

    "return a's power"

    return a**3

 

print add(3)

这时,add = decoMakerDoc(T_T)(decoMaker(^_^)(add))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值