Python 装饰器装饰器(Decorator)
要想玩装饰器,那就得了解一下闭包,我们不得不这样做!
闭包闭包(Closure)
对象是附加了方法的数据。闭包是附带数据的函数。
闭包是引用了自由变量的函数。大白话说,只要某个函数中引用了一些不在当前代码全局中定义的变量,那么这个函数就是闭
包函数。
def f1(x):
x1 = x
def f2(y):
y = x1 + y
return y
return f2
In [1]: def f1(x):
...: x1 = x
...: def f2(y):
...: y = x1 + y
...: return y
...: return f2
...:
In [2]: fun = f1("你好")
In [3]: fun("世界")
Out[3]: '你好世界'
In [4]: f1("武汉")("加油")
Out[4]: '武汉加油'
In [5]: f1(f1("武汉")("加油"))("!!!")
Out[5]: '武汉加油!!!'
这是怎么回事呢这是怎么回事呢 ??
Python 中一切皆对象中一切皆对象
fun = f1("你好") 中 fun 是指向 f1 函数返回的一个对象,也就是 f2 这个函数,通过传递参数 武汉 ,fun 与以下代码概念一致
def f2(y):
y = "武汉" + y
return y
当 fun("世界") 大家都明白,“你好世界”
f1("武汉")("加油") 是另一种写法而已。
当调用 fun 时,f1 的作用域已经结束,x1 就成了孤鸿野鬼,它不在当前代码全局中被定义,x1 是调用 fun 被使用的变量,所以
fun 是附带数据的函数。
装饰器装饰器
装饰器语法只是一种语法糖,其返回值为另一个函数的函数,通常使用 @wrapper 语法形式来进行函数变换。装饰器通俗的讲
就是某一个函数在不改动其代码的情况下而为它增加额外的功能。
现在有一段代码,它的功能是打印一些内容
def f1():
print("你好")
如果想为其增加功能,打印内容中要包含当前时间。这不很简单吗!!!
import time
def f1():
print("你好")
print(time.ctime())