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()

猜你喜欢

转载自www.cnblogs.com/dalun101/p/9365497.html