Python 装饰器

装饰器:在不改动其他代码的前提下,添加额外的功能。

参考资料:如何理解Python装饰器?

装饰器 

def newfunc(func):
     def baozhuang():

         func()#原有功能包裹在函数中
         addNewFunc()#新添加的功能,像装饰了func()函数

    return baozhuang


@newfunc
func()

 

带参数的装饰器

加多一层

def newfunc(status):
    def lalala(func)
        def wrapper(*args, **kwargs):
             if status == doSth
                 func()#原有功能包裹在函数中
                 addNewFunc()#新添加的功能,像装饰了func()函数
         return wrapper
    return lalala

 

@newfunc(status = 'doSth')
def oldfunc()
    pass

 

 

事例

——————————————————————————————————————————————————————

比如有如下的原有功能——打电话: 

def ming():
    print("小明打电话")


def hong():
    print("小红打电话")

后来想让小明或小红打通电话后加入新功能——打招呼:

一开始比较直观的做法肯定是在原有函数的下面加一句

def ming():
    print("小明打电话")
    print("say:hello")#新增功能

def hong():
    print("小红打电话")
    print("say:hello")#新增功能

因为目前要加的功能只有上面这一句话print("say:hello"),所以看起来还没有那么的啰嗦。但如果是一个需要几百行代码才能实现的功能呢?总不能每个函数都把这几百行代码复制粘贴一次。这样代码的重复性就很高,可读性也变差了。

 

下面用装饰器来实现一下添加-打招呼-的新功能

def sayHello(func):
#用于打招呼
    def wrapper():
        func()
        print("say:hello")
    return wrapper

@sayHello #装饰器的语法糖
def ming():
    print("小明打电话")

@sayHello
def hong():
    print("小红打电话")

然后看一下输出效果

hong()
print("————我是分割线————")
ming()
小红打电话
say:hello
————我是分割线————
小明打电话
say:hello

 

 

类的装饰器 

新建一个类(如Foo),重写__call__方法

@Foo 附加到函数上时

    class Foo(object):
        def __init__(self, func):
            self._func = func

        def __call__(self):
            print('class decorator runing')
            self._func()
            print('class decorator ending')

    @Foo
    def bar():
        print('bar')

    bar()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值