Python 内嵌函数、闭包、装饰器浅析

Admin 2019-10-25 12:36:57 Python

Python 内嵌函数(返回式函数)、闭包、装饰器,共同之处都是以函数作为参数传递到函数,不同之处在于调用和返回的的区别。

内部函数

def func(num):
  def add(num):      # 传入外部参数
    return num + 1
  return add(num)    # 返回内嵌函数

>>> func(1)
2

内嵌函数引用外部传入参数,外部函数显示的返回是内部函数add的调用, 当需要在函数内部多次执行复杂任务时比较有用,避免重复代码。

闭包

内嵌函数也可看做是一个闭包, 闭包是一个可以由另一个函数动态生成的函数,且可以改变函数外变量的值。

def func(num):
  def add():
    return num    # 在内部函数引用传入参数
  return add      # 返回函数本身,不包含函数调用
  
>>> func(1)
<function add at 0x10b38ac08>
>>> func(1)()
1

装饰器

装饰器也是一个函数, 它把一个函数作为输入,并且返回另一个函数。

def func(func):                   # 函数作为参数传递
  def add(*args, **kwargs):
    print "作用体"
    return func(*args, **kwargs)  # 返回传递函数
  return add

def test(num):
  return num + 1

>>> func(test)                    # 传入test函数进行装饰
<function add at 0x10b38bde8>     # 装饰后的函数,类似闭包

>>> func(test)(1)                 # 对装饰后的函数进行调用
作用体
2

@func                             # @ 同时可以调用多个装饰器,执行顺序不分先后
def test(num):
  return num + 1

# 无论 func 传入的是什么, 装饰器都会返回一个新的函数。只是在被装饰的函数前,执行或附加代码。

带参数的装饰器

def func(ss):                       # 传入参数
   def execs(func):                  
      def add(*args, **kwargs):       
         print "作用体, %s" %ss
         return func(*args, **kwargs)
      return add
   return execs

>>> func("test")
<function execs at 0x10b38bde8>

>>> func("test")(test)(1)
作用体, test
2

@func("test")
def test(num):
   return num + 1

注意: 对test进行装饰后,test的函数命名空间发生了变化

>>> test.__name__
'add'

可以使用functools(是自带库)模块指向原来的命名空间

import functools

def func(func):
  @functools.wraps(func)
  def add(*args, **kwargs):
    print "作用体"
    return func(*args, **kwargs)
  return add
  
@func
def test(num):
  return num + 1

>>> test.__name__
'test'
相关文章
最新推荐