python3 裝飾器
阿新 • • 發佈:2021-01-23
技術標籤:Python
一、閉包作用:為了能夠在外部去呼叫內部函式,為了裝飾器的使用.
""" 閉包 1.兩個函式的巢狀 2.內部函式用到了外部函式的資料 3.內部函式本身作為外部函式的返回值 """ def outer(a): # 1.外部函式 def inner(): # 2.內部函式 print(a) #3.使用外部函式的值 return inner # 4.返回內部函式 #這個呼叫->獲得到內部函式 result=outer(100) result() """ 說明: (1) inner()直接在外部呼叫不行 原因: inner是outer的函式內部的資料,區域性變數; 通過一個result接收了指向了outer的返回值(inner函式,outer的區域性變數) result > inner函式 # result = outer(100) # 執行這個外部函式 result = inner # result() 實際就是為了在外部呼叫 outer 的區域性變數(內部函式) inner """
二、裝飾器的形成以及作用:
1、形成:裝飾器需要建立在閉包的條件之下
2、作用:不修改一個函式的內部原始碼的情況下, 對一個函式的功能進行增加
(2.1) 如果每個函式中新增功能,可以這麼實現;
def fun1(): print('pretty good,actually',end='') print('\tbreakfaster') def fun2(): print('pretty good,actually', end='') print('\thava lunch') def fun3(): print('pretty good,actually', end='') print('\tdinner') fun1() fun2() fun3()
# 需求:
# 1.給每個函式增加功能: pretty good,actually -> 功能的新增
# 2.不修改原來函式內部程式碼的情況下
# 問題: 不修改原來函式內部程式碼的情況下, 很方便的對每個函式進行一個功能的新增;
# 解決方法,用到裝飾器
(2.2)使用閉包來實現,每個函式新增的功能
"""
如果c能夠指向fun1,那麼c()呼叫就會執行print('breakfaster')
c 其實跟要被新增功能的fun1 函式 指向同一片記憶體空間,
我們在c()其實也就fun1()呼叫之前, 去增加了功能,print('pretty good,actually'),
他們存在於閉包的內部函式inner當中, 所以呼叫內部函式inner, 就能夠完成功能的新增
"""
def outer(c): # 外部函式 -接收了一個形參c
def inner(): # 內部函式
print('pretty good,actually', end='')
c() # 把形參c呼叫, 既然能夠被呼叫,那麼傳過來應該是一個函式
return inner # 返回內部引用
# #宣告函式
def fun_1():
print('\t早餐')
#呼叫
a=outer(fun_1)
a()
def fun_2():
print('\t午餐')
def fun_3():
print('\t晚餐')
b=outer(fun_2)
b()
w=outer(fun_3)
w()
(2.3)使用閉包裝飾器來實現,每個函式新增的功能
""" 上面呼叫方式十分麻煩,有沒有更加簡單的方式... """ """ 1.兩個函式的巢狀 2.內部函式用到了外部函式的資料 3.內部函式本身作為外部函式的返回值 """
注意:@outer # python的語法 >a = outer(fun_1)被執行, @是一個固定的符號, outer就是閉包的外部函式名;
@outer # python的語法 >a = outer(fun_1)被執行, @是一個固定的符號, outer就是閉包的外部函式名;
def outer(c): # 外部函式 -接收了一個形參c
def inner(): # 內部函式
print('pretty good,actually', end='')
c() # 2.把形參c呼叫, 3.既然能夠被呼叫,那麼傳過來應該是一個函式
return inner # 返回內部引用
# 說明:@是一個固定的符號, outer就是閉包的外部函式名;
@outer #a=outer(fun_1)
def fun_1():
print('\t早餐')
@outer #b=outer(fun_3)
def fun_2():
print('\t午餐')
@outer # c=outer(fun_2)
def fun_3():
print('\t晚餐')
# 再呼叫
fun_1()
fun_2()
fun_3()