python中:from * import 與 import 詳解


在python 中導入模塊是我們最常用的功能,基本每個.py 文件中都會有 import 或者是 from * import 語句,可是,這兩種方法有什么不同,有該怎么用?今天就好好分析一下。

先上定義:

  模塊導入允許我們將一個個獨立的程序功能分別實現然后組合成一個復雜的系統。

  主要有以下作用:

  代碼重用:

    我們知道一段代碼需要用到兩次的時候,我們就需要寫一個函數了這是一個道理。

  避免變量名沖突:

    每個模塊都將變量名封裝進了自己包含的軟件包,這可以避免變量名的沖突,除非使用精確導入。

import 語句

  import 語句就是這樣, 也可以在一行內導入多個模塊:

    import module1[, module[...moduleN]]

  但是這樣的代碼可讀性不如多行導入語句,而且在性能上和生成 Python 字節碼時這兩種做法沒有什么不同,所以一般情況下,我們使用第一種格式。

  import 工作方式:

    其中,導入程序搜索的目錄如下:

    import 解釋  ;

      加濕器執行到 import 語句,如果早搜索路徑中找到了指定的模塊,就會加載它,該過程遵循 LEGB 作用域原則,如果在一個模塊中頂層導入,那么它就是全局的,如果早函數中導入,那么它的作用域就是局部的,如果模塊時被第一次導入,它將被加載並執行:

 

   import as 語句

    有時候你導入的模塊或是模塊屬性名稱已經在你的城中使用了,或者你不想使用導入的名字,可能時它太長不便輸入什么的,總之你不喜歡它,這已經成為 Python 程序員的一個普遍要求,使用自己想要的名字替換模塊的原始名字。一個普遍的解決方案就是把模塊復制給一個變量。這樣便於自己使用。

  from-import 語句

    你可以在你的模塊中導入指定的模塊屬性,也就是指定名稱導入到當前的作用域。

    使用:

      from-import 語句可以實現我們的目的,它的語法是:

      from module import name1,[name2..[name3...]]

  from * 

    當我們使用 from * 的時候,會取得模塊頂層左右賦值的變量名的拷貝。

      注意:  當我們使用這種方法時,就會出現變量名的重復問題,因為我們把另外一個模塊中的所有變量導入進來。在命名的時候會出現命名沖突的情況。

    導入只發生一次

      一個模塊只被加載一次,無論它被導入多少次。

      如果你的模塊導入了 sys 模塊。而你要導入的其他的5個模塊也導入了它,那么每次都加載 sys (或是其他模塊)不是明治之舉,加載只在導入時發生。

  import 和 from 是賦值語句

    像 def 一樣,import 和 from 是可執行的語句,他們可以出現在 if 中,可以出現在函數中,執行這些語句的時候才會進行解析,也就是說,被導入的模塊和變量名只有在對應的 import 或 from 語句執行后才可以使用。

    import 將整個模塊對象賦值給一個變量名

    from 將一個或多個變量名賦值給另外一個模塊中同名的對象,所以 from 容易污染命名空間。

 

 為什么不建議使用 “from * import ”

  在實戰中, “from module import * ” 不是良好的編程風格,如果使用 from 導入變量,且那些變量碰巧和作用域中現有的變量名同名,那么變量就會悄悄覆蓋掉,使用 import 語句時后就不會發生着中問題,因為我們是通過模塊名才獲取的變量名,像 module attr 不會和現有的作用域的 attr 沖突。

 

  何時使用 from module import:

    我們只在兩種場合下建議使用這樣的方法,一個場合是:目標模塊中的屬性非常多,杜甫鍵入模塊名不方便,例如: Tkinter (Python/TK)和 Numpy (Numeric Python)模塊,可能還有 socket 模塊。

  另外一個場合實在交互解釋器下,因為這樣可以減少輸入次數。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM