1. 程式人生 > 其它 >python3 裝飾器

python3 裝飾器

技術標籤: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()