Python 装饰器精讲

  1. 先复习下函数参数的内容:

    a. 可变参数

    def calc(*numbers):
        sum = 0
        for n in numbers:
            sum = sum + n * n
        return sum
    
    // 调用该函数时,可以传入任意个参数,包括0个参数: 
    >>> calc()
    0
    >>> calc(1, 2)
    5
    >>>
    

    b. 关键字参数

    def person(name, age, **kw):
    	print('name:', name, 'age:', age, 'other:', kw)
    
    函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以
    只传入必选参数:
    >>> person('Michael', 30)
    name: Michael age: 30 other: {}
    
    也可以传入任意个数的关键字参数:
    >>> person('Bob', 35, city='Beijing')
    name: Bob age: 35 other: {'city': 'Beijing'}
    >>> person('Adam', 45, gender='M', job='Engineer')
    name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
    

    如果函数的参数定义是(*args, **kw),表示该函数可以接受任意参数的调用。

  2. 增强下涉及 *args **kwargs 的函数调用

    def business(a):
        print "In the business---"
        print a
        print "end of the business---"
    
    def test(*args, **kwargs):
        print "In the test"
        print args
        print kwargs
        business(*args, **kwargs)
        print "end of test"
    
    
    test("rob")
    
    args = (1,)
    kwargs = {}
    business(*args, **kwargs)
    
    运行结果:	
    	In the test
    	('rob',)
    	{}
    	In the business---
    	rob
    	end of the business---
    	end of test
    
    	In the business---
    	1
    	end of the business---
    
  3. 装饰器:本质上是返回函数的高阶函数

    def my_decorator(func):
        print "In the my_decorator"
        def wrapper(*args, **kwargs):  // 如果函数的参数定义是(*args, **kw),表示该函数可以接受任意参数的调用
            print "In the wrapper"           
            func(*args, **kwargs)
            print "end of the wrapper"
        return wrapper
     
    @my_decorator
    def businessA(a):
        print "In the businessA---"
        print a
        print "end of the businessA---"
     
    businessA("cheng")
    
    运行结果:
     	In the my_decorator
     	In the wrapper
     	In the businessA---
     	cheng
     	end of the businessA---
     	end of the wrapper
    

    把 @my_decorator 放到 businessA 函数的定义处,相当于执行了语句:

    businessA = my_decorator(businessA)

    由于 my_decorator() 是一个decorator,返回一个函数,
    所以,原来的 businessA()函数仍然存在,只是现在同名的 businessA 变量指向了新的函数,
    于是调用 businessA() 将执行新函数,即在 my_decorator()函数中返回的wrapper()函数。

    wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。
    在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值