這篇文章主要介紹了Python變量作用域LEGB用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
閉包就是, 函數內部嵌套函數. 而 裝飾器只是閉包的特殊場景而已, 特殊在如果外函數的參數是指向一個, 用來被裝飾的函數地址時(不一定是地址哈, 隨意就好) , 就有了 "@xxx" 這樣的寫法, 還是蠻有意思的. 裝飾器的作用是 在不改變原函數的代碼前提下, 額外給原函數填寫新功能. 寫法上來看, 還是比較簡潔優雅的.
裝飾器的通俗寫法
# 裝飾器的通用寫法def out(func): def inner(*args, **kwargs): print("we are checking...", args[0]) return func(*args, **kwargs) return inner@outdef check_2019_nCov(name): return f"now, {name} is very healthy..."tmp = check_2019_nCov('youge')print(tmp)# outputwe are checking... yougenow, youge is very healthy...
給裝飾器傳參
雖然這種 "@" 的寫法, 是要求 外函數的參數是一個 func 地址 , 但要達到可以傳參, 只要 再在外面包一層函數 (作用是接受參數) , 這樣不就相當于擴大作用空間, 拿到參數了呀 .
# 最外層的函數作用是, 給裝飾器傳遞參數def get_param(*args, **kwargs): def out(func): def inner(*args, **kwargs): print("get params", args, kwargs) return func(*args, **kwargs) return inner return out@get_param("youge")def check_2019_nCov(name): return f"now, {name} is very healthy..."tmp = check_2019_nCov("youge")print(tmp)# outputget params ('youge',) {}now, youge is very healthy...
這種個裝飾器傳遞參數的應用場景, 在 Web應用中, 以 Flask 為例, 就是所有的 路由 url 的概念呀, 如 route("/login") 這樣的寫法, 其原理就是用各種裝飾器來實現 路由 -> 視圖 的映射關系的.
仔細一看, 整個過程忽略了一個重要的話題, 即命名空間, 及 變量的作用域, 或者說命名空間如怎樣的.
LEGB 法則
命名空間
前篇已經詳細闡述過了, Python 變量的本質是指針, 是對象的引用, 而 Python中 萬物皆對象. 這個對象是真正存儲數據的內存地址, 是各種類(數據類型, 數據結構) 的實例. (變量就是用來引用對象的) 差不多這個意思吧.
最為直觀的解釋:
" A namespace is a mapping from names to objects". (變量名和對象的映射)
"Most namespaces are currently implemented as Python dictionaries." (大部分命名空間通過字典來實現)
即命名空間是用來 避免變量命名沖突 的約束. 各個命名空間是彼此獨立的, 一個空間中不能重名, 不同空間中是不沒有關系的. 就跟 計算機系統, 存儲文件是樣的邏輯.
for i in range(10): print(i) # 這兩句話都用到了 i 但其各自的空間是不一樣的. [i for i in range(100)]
新聞熱點
疑難解答