Python decorator 1: 函数

A.把要 装饰的方法作为输入参数
B.在函数体内可以进行任意的操作(可以想象其中蕴含的威力强大,会有很多应用场景),

C.只要确保最后返回一个可执行的函数即可(可以是原来的输入参数函数, 或者是一个新函数)


如果只需要在被包装函数执行前插入代码,decorator可以加上插入代码后返回原函数 (例1,3)

如果需要在包装函数执行之前和之后都插入代码,decorator需要另加一个函数并返回这个函数,在这个函数中调用传入的函数(例2,4)


1. 无参数装饰器 – 包装无参数函数

def decorator(func):
    print "hello"
    return func

@decorator
def foo():
    pass

foo()

等价于

foo = decorator(foo)
foo()


2. 无参数装饰器 – 包装带参数函数

def decorator_func_args(func):
    def handle_args(*args, **kwargs): #处理传入函数的参数
        print "begin"
        func(*args, **kwargs)   #函数调用
        print "end"
    return handle_args


@decorator_func_args
def foo2(a, b=2):
    print a, b

foo2(1)

等价于

foo2 = decorator_func_args(foo2)
foo2(1)


3. 带参数装饰器 – 包装无参数函数

def decorator_with_params(arg_of_decorator):#这里是装饰器的参数
    print arg_of_decorator
    #最终被返回的函数
    def newDecorator(func):
        print func
        return func
    return newDecorator


@decorator_with_params("deco_args")
def foo3():
    pass
foo3()

等价于

foo3= decorator_with_params(arg_of_decorator)(foo3)

4. 带参数装饰器– 包装带参数函数

def decorator_whith_params_and_func_args(arg_of_decorator):
    def handle_func(func):
        def handle_args(*args, **kwargs):
            print "begin"
            func(*args, **kwargs)
            print "end"
            print arg_of_decorator, func, args,kwargs
        return handle_args
    return handle_func


@decorator_whith_params_and_func_args("123")
def foo4(a, b=2):
    print "Content"

foo4(1, b=3)

 等价于 

foo4 = decorator_whith_params_and_func_args("123")(foo4)
foo4(1,b=3)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值