Python 闭包与装饰器

本文详细解析了Python中闭包的应用及装饰器的工作原理,包括常规装饰器、类装饰器、通用装饰器和带参数装饰器的具体实现方式。

一、闭包:


  def test(number):
    print('------1-------')

    def test_in():
      print('------2-------')
      print (number+100)

    print('------3-------')
    return test_in()#返回内置函数

  ret = test(100)#输出1,3两条线,相当于ret 与 test_in指向同一个函数
  ret()#输出2线,200


二、装饰器


  在不改变原有函数功能的情况下,添加新的功能

  1、常规装饰器

    def derect1(fn):
      print('正在装饰1')
      def inner1():
        print('------1------')
        return '<b>' + fn() + '</b>'
      return inner1

    def derect2(fn):
      print('正在装饰2')
      def inner2():
        print('------2------')
        return '<i>' + fn() + '</i>'
      return inner2

    #只要Python解释器执行到了这个代码,就会自动进行装饰,而非等到调用时执行
    @derect1
    @derect2#等价于:test = derect2(test)
    def test():
      return 'hello world!'

    print(test())#正在装饰2
           #正在装饰1
           #------1------
           #------2------
           #<b><i>hello world!</i></b>

  2、类当做装饰器:

    class Test(object):
      def __init__(self,func):
        print('初始化')
        print('func name is %s'% func.__name__)
        self.__func = func
  
      def __call__(self):#由于对象本身不能直接调用,所以用到该方法
        print('装饰器中的功能')
        self.__func()

    @Test#等价于:test = Test(test) 创建一个test对象,让func指向函数
    def test():
      print('----test----')
    test()


  3、通用装饰器

    def derect(functionName):
      def inner(*args,**kwargs):
        name = functionName(*args,**kwargs)
        return name#没有返回值时,自动返回None
      return inner

  4、带有参数的装饰器

    def func_arg(arg):
      def func(functionName):
        def inner():
          print(arg)
          functionName()
        return inner
      return func

    @func_arg('hello')#执行该函数的结果是func函数的引用
            #即此句等价于@func
    def test():
      print('-------test--------')

    test()

 

转载于:https://www.cnblogs.com/dalun101/p/9365497.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值