Python_閉包和裝飾器

辰令發表於2024-11-27

Python 名稱空間

 Namespaces and Scope: multiple namespaces
     物件和名稱的歸屬--Search   closure  enclosing
	   Local_Global_built-in

內建名字空間,任何模組均可訪問它,它存放著內建的函式和異常。
全域性名字空間,它記錄了模組的變數,包括函式、類、其它匯入的模組、模組級的變數和常量。 global宣告 是對整個環境下的變數起作用
閉包: 閉包通常與函式相關聯
區域性名字空間,它記錄了函式的變數,包括函式的引數和區域性定義的變數	
	   
1. the local space
   locals()是Python中一個非常有用的內建函式,尤其是在除錯和檢查當前作用域的區域性變數   
    locals()函式不需要任何引數,並且返回當前區域性變數作用域的內容 
	
2 Enclosed(閉包作用域):閉包中外部函式定義的變數,但非全域性變數
   Enclosed  由閉包函式和其外部函式共同建立的一個作用域
    閉包(Closure)
      閉包是由一個函式以及建立該函式時的作用域中變數的引用環境共同組成的	
	  
    建立閉包--使用閉包		
    內層函式不僅可以訪問,還要可以修改外層函式的變數,那麼需要用到 nonlocal宣告
           nonlocal 關鍵字是定義在閉包裡面的	

    d.__closure__
    閉包的__closure__方法,可以檢視每個cell物件的內容。
    
    for i in d.__closure__:
        print(i.cell_contents)
    cell_contents 解釋了區域性變數在脫離函式後仍然可以在函式之外被訪問的原因,
	因為變數被儲存在cell_contents中了			   

3. globals()  以及  dir()   #  獲得當前模組的屬性列表
  
   Modules are Python files, and they contain objects such as functions that can be imported and used by other programs
   __dict__ This dictionary is the namespace for the module.
    __name__  
	     當 Python 檔案作為一個獨立指令碼執行時,__name__ 被設定為 "__main__",而在被其他模組匯入時,__name__ 被設定為該模組的名稱	
	__file__ 
	    是一個儲存著當前模組所在檔名的全路徑的字串變數,用於獲取當前指令碼的絕對路徑	
    dir()帶引數時,返回引數的屬性、方法列表	 
     			
4.built-ins 	預設匯入  has a dict attribute 
	   two default modules without requiring an import: the module main and the module builtins .
	builtins.py  模組,是python的內建模組,在執行時會自動匯入該模組。在該模組中定義了很多我們常用的內建函式,比如print,input 等。
    
    builtins是一個內建模組,它在Python直譯器啟動時自動載入,幷包含了一組Python的內建函式、異常和常量
      Python 的內建模組通常被編譯到 Python 直譯器-builtins.py看起來只包含了空函式定義	
       實際上是透過Python的C API介面呼叫C語言實現的底層函式	
    直譯器實現的,它們的具體實現通常是用C語言編寫 __builtins__.__dict__ 約有151個函式和變數
	   moduleSpec
	   class 
	   built-in function
	 
       Ellipsis 物件: 在python程式碼中通常寫作 … ,	
        Exception  TypeError 		   

閉包的應用場景

閉包的應用場景
1.資料封裝和隱私:
	閉包可以用來封裝資料,透過內部函式來訪問這些資料,而外部程式碼無法直接訪問。這增加了資料的安全性。
	把一些變數隱藏到函式內部,作為區域性變數。但是由於Python中作用域的搜尋順序,函式內的變數不會被函式外的程式碼讀取到。
        想要函式外部的程式碼能夠讀取函式內部的變數,那麼就可以使用閉包,函式內部再定義一個函式,這樣就可以引用到外層變數
     區域性變數無法共享和長久的儲存,而全域性變數可能造成變數汙染,閉包既可以長久的儲存變數又不會造成全域性汙染。
	物件導向: 這方面--“讀取函式內部的變數”和“讓函式內部的區域性變數始終保持在記憶體中”,都可以被 Python 中現成的物件“類”很好地實現
2.函式工廠:
	閉包可以用來建立具有特定行為或狀態的函式物件。這些函式物件可以根據需要定製。

3.裝飾器:
	Python中的裝飾器本質上就是閉包的一種應用。裝飾器接收一個函式作為引數,並返回一個新的函式,這個新函式在某種條件下會呼叫原函式。
    透過閉包,裝飾器可以記住額外的狀態資訊,並在被裝飾的函式執行時使用這些資訊。
	 內建裝飾器: @classmethod  @staticmethod  @property
	 自定義裝飾器(無參)  @functools.wraps(func)
	絕大多數裝飾器都是基於函式和 閉包 實現的
	 物件導向設計(Object-Oriented Design,OOD):Python 對某個物件是否能透過裝飾器( @decorator)形式使用只有一個要求:
	    decorator 必須是一個“可被呼叫(callable)的物件
	   函式自然是“可被呼叫”的物件。但除了函式外,我們也可以讓任何一個類(class)變得“可被呼叫”(callable)。
	      只要自定義類的 __call__ 魔法方法即可	
4.延遲計算:
	閉包可以用來實現惰性求值(Lazy Evaluation),即只有在需要的時候才進行計算

函式

 列表推導式  迭代式  生成器 裝飾器 
  zip()
    zip函式用於將可迭代的物件作為引數,將物件中對應的元素打包成一個個元組,然後返回由這些元組組成的迭代器	 
	
裝飾器的背後--是語言開發模式的設計,應用者先使用,再去探索這之後的原因,而使用前的有限信任和有限開始,是行動的一種重要方式

python

 Python中,註解(Annotations)是一種為變數、函式引數、函式返回值等新增元資訊的方式	
     -> 型別提示(Type Hints)
	 裝飾器註解
	  **三、上下文管理器註解**
	  簡化類定義 避免手動編寫大量的樣板程式碼  自動生成方法 提高開發效率
 Java 註解(Anno
    註解並不直接影響程式碼的語義,但卻能被某些工具軟體(如編譯器、框架)所讀取和利用	
      編譯檢查 - 如@Override放在方法前,如果該方法不是重寫父類的方法,則編譯器會發出警告
      生成額外的檔案 - 如Javadoc工具會根據原始碼中的註解來生成API文件	
       編譯時動態處理-在編譯時讀取註解的資訊,然後根據註解的資訊進行一些其他處理
   註解的宣告 和使用   用於註解其他註解的註解稱為元註解
      內建註解 @Override  @Deprecated	   

參考

 【python】Python中閉包的是什麼,閉包原理分析與應用實戰 https://blog.csdn.net/littlefun591/article/details/140492786
  The Practice of Computing Using Python, 2nd International Edition  

相關文章