PyQt我的Python自学之路程序员

Python装饰器

2017-01-03  本文已影响373人  木兮家先生

1. 什么是装饰器?

装饰器是一个用来装饰函数的函数。感觉有点拗口,那么,在我的理解,装饰器只是个辅助函数,有没有它并不影响被装饰函数的运行。

2. 函数表达式

先看一下函数表达式,有这样一个函数:

def fun():
  print("I am fun")

我们都知道,fun()运行输出:

>> I am fun

然而运行 fun则输出:

>> <function __main__.fun>

所以我们看到函数后加括号就进入了函数内部运行,不加括号只是代表了一个函数对象(Python内部一切皆为对象),记住这一点后面容易理解装饰器。

3. 场景

现在有一堆函数:

def fun1():
  print("I am fun1")

def fun2():
  print("I am fun2")

def fun3():
  print("I am fun3")

为了证明这些函数是我写的,所有的函数后面都要打印一句话:

def fun1():
  print("I am fun1")
  print("author is kang")

但是所以的函数都加这句话似乎太麻烦了。这个时候尅考虑使用闭包来实现。

4. 闭包实现

改成闭包的实现形式:

def show_author(fun):
  def warpper():
    fun()
    print("author is kang")
  return warpper
fun1=show_author(fun1)

注意到运行fun1=show_author(fun1)这段代码fun1并没有被执行,只是生成了一个新的函数,这个函数等价于第3节最后的函数。

5. 用装饰器简化

以上需求的实现还是有一点繁琐,Python大发给我们提供了@语法糖,来看一下怎么使用:

@show_author
def fun1():
  print("I am fun1")

运行fun1的结果和第3节最后的函数也是一致的。
如程序所示,@shoe_me和原来闭包实现fun1 = show_author(func1)是完全等价的,这样便能在不改变原函数的情况下添加装饰,增加功能。

上一篇 下一篇

猜你喜欢

热点阅读