1. 程式人生 > >函數的閉包和裝飾器

函數的閉包和裝飾器

time pre col 美的 style 修改 功能 技術 def

函數的閉包:

  #1.閉 必須是內部的函數   #2.包 引用了外部作用域中的變量

命名空間:

  一共有三種命名空間從大範圍到小範圍的順序:內置命名空間、全局命名空間、局部命名空間

作用域(包括函數的作用域鏈):

小範圍的可以用大範圍的
但是大範圍的不能用小範圍的
範圍從大到小(圖)

技術分享

在小範圍內,如果要用一個變量,是當前這個小範圍有的,就用自己的
如果在小範圍內沒有,就用上一級的,上一級沒有就用上上一級的,以此類推。
如果都沒有,報錯

函數的嵌套:

  嵌套調用

  嵌套定義:定義在內部的函數無法直接在全局被調用

函數名的本質:

  就是一個變量,保存了函數所在的內存地址

閉包:

  內部函數包含對外部作用域而非全局作用域名字的引用,該內部函數稱為閉包函數

在閉包的基礎上延伸出來一個小東西————裝飾器

  裝飾器的本質:一個閉包函數

  裝飾器的功能:在不修改原函數及其調用方式的情況下對原函數功能進行擴展

開放封閉原則

  1.對擴展是開放的

    為什麽要對擴展開放呢?

    我們說,任何一個程序,不可能在設計之初就已經想好了所有的功能並且未來不做任何更新和修改。所以我們必須允許代碼擴展、添加新功能。

  2.對修改是封閉的

    為什麽要對修改封閉呢?

    就像我們剛剛提到的,因為我們寫的一個函數,很有可能已經交付給其他人使用了,如果這個時候我們對其進行了修改,很有可能影響其他已經在使用該函數的用戶。

裝飾器完美的遵循了這個開放封閉原則。

裝飾器的主要功能和裝飾器的固定結構

裝飾器的主要功能:

在不改變函數調用方式的基礎上在函數的前、後添加功能。

裝飾器的固定格式:

1 def timer(func):
2     def inner(*args,**kwargs):
3         ‘‘‘執行函數之前要做的‘‘‘
4         re = func(*args,**kwargs)
5         ‘‘‘執行函數之後要做的‘‘‘
6         return re
7     return inner

[email protected]

函數的閉包和裝飾器