理解装饰器之前,先看下这个代码 :
def test():
print("testing")
def test():
print(" love ")
test()
大家猜猜 打印的什么 ?
答案是 love
为了 好理解, 我们先看以下 这个就好理解了
a=2 # 首先开辟一段内存, 让 a 指向2
a=3 # 又开辟一段内存, 然后让a 指向 3, 2 这块内存没有指针指向 ,垃圾回收就回收掉
print(a) # 3
同理就可以理解上边的吧 ,
def test(): #函数名 test 指向函数体 print(“testing)
print("testing")
def test(): 函数名 test 指向函数体 print(”“love) , 前面的 print(”testing‘)会被回收了
print(" love ")
test() # 执行 当然是 print(“love”)
现在我们的问题是 在不改变方法的情况下,如何扩展功能呢? 这个好像是个难题,不改代码就能增加功能,感觉匪夷所思。
这个不能难道我们的优秀的开发者 。
def test(func):
def test_in():
print("testing")
func()
return test_in
def f1():
print("---f1----")
f1=test(f1)
f1()
咱们直接看答案 是:
testing
—f1----
看到了吗 , 已经实现了不改代码的情况下, 已经改变了函数功能 。 神奇吧
解析如下:
- test(f1) 有两层关系 1. f1 代表是 f1函数名的指针当作参数传入 test() , 2. test(f1) 代表 返回test_in 函数指针
- f1=test(f1) 把test_in 函数指针赋值给 f1 ,f1 的函数指针 有 指向 print(“----f1----")变成了test_in里的函数体
- f1() 执行test_in 里的函数体
其中test 函数 就是一个闭包函数。