First-class objects

在 Python 语言中,函数(function)的定义为给定参数返回一个值,大部分没有附带效果,有一些例外比如 print 函数,返回 None,附带的效果是会打印内容到控制台。Python 虽然不是函数式语言,但是支持一些函数式编程的概念,比如将函数当作一等对象(first-class objects)使用。这就是说函数可以像 str, int 等一样被相互传递以及用作参数。

Inner Function

在函数中定义的函数叫做内联函数(inner function),它们的作用域是在父函数内部。

Functions as return values

有了以上两个特性以后,我们可以在函数中定义内敛函数,根据需要返回一个内联函数。与此同时,外部接收返回值的变量可以调用。

Dectorator

在以上前置内容介绍完,我们可以定义如下一个函数

def decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

def say_whee():
    print("Whee!")

say_whee = decorator(say_whee)

通过 decorator 函数,我们改变了其他函数的行为,即在函数执行前后分别进行了 print 打印。最后一句,显的冗余,我们通过语法糖进行替换。

def decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@decorator
def say_whee():
    print("Whee!")

@decorator 只是一个更间接的方式来表达 say_whee = decorator(say_whee)

Fancy decorators

下面是一些进阶的功能:

  • Add decorators to classes
  • Add several decorators to one function
  • Create decorators with arguments
  • Create decorators that can optionally take arguments
  • Define stateful decorators
  • Define classes that act as decorators

Refer

Python Decorator