模塊導入

模塊導入使用import語句,當解釋器執行到import語句時, 若是在搜索路徑中找到了指定的模塊, 就會加載它
該過程遵循LEGB做用域原則, 若是在一個模塊的頂層導入, 那麼它的做用域就是全局的,若是在函數中導入, 那麼它的做用域是局部的
若是模塊是被第一次導入, 它將被加載並執行

當導入多個模塊時,可以使用以下格式:
  1) import 模塊1,模塊2,模塊3,...
  2) import 模塊1
    import 模塊2
    import 模塊3
    ...
以上兩種格式在性能上和生成 Python 字節代碼時沒有什麼不一樣,所以通常狀況下, 使用多行導入,由於可讀性高

以datetime爲例,datetime是一個文件datetime.py,裏面定義了一個叫datetime的類,這個類有一個方法叫作nowsocket

import 模塊
  引入模塊datetime,也就是文件datetime.py
  當使用該模塊裏的datetime類時,需這樣寫代碼:datetime.datetime
  當使用該模塊裏的datetime類的now方法時,需這樣寫代碼:datetime.datetime.now()

  注意:當import多個層級時,如import xx.xx.xx,最後的一個xx只能是package或者module,但絕對不能是函數或者類的名字
  如:import datatime.datatime 或者 import datatime.datatime.now是不能夠的

import as
  有時導入的模塊或是模塊屬性名稱已在程序中使用了, 或不想使用導入的名字
  可以使用import as替換成本身想要的名字,一般把模塊賦值給一個變量
    如:import datetime as dt

from import
  from import用於引入模塊中的類,函數,變量
  from datetime import dateti  me 表示引入模塊datetime也就是文件datetime.py中的datetime類函數

  當使用該模塊裏的datetime類時,需這樣寫代碼:datetime
  當使用該模塊裏的datetime類的now()方法時,需這樣寫代碼:datetime.now()
  datetime.datetime.now()會報錯,所以經過from import方式導入模塊內容時,若是當前代碼中已有datatime屬性,則屬性就會被覆蓋
  而經過import方式就不會,由於import方式是須要"模塊名.屬性"來引用的模塊內容的,所以不會產生衝突

  from 模塊 import *
    引入模塊中的全部的公開成員,好比有些成員名帶"_"或"__"的,它們是不會被引用的

  什麼時候使用from import
    1) 目標模塊中的屬性很是多, 反覆鍵入模塊名很不方便 ,
      如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模塊 , 可能還有 socket 模塊
    2) 交互解釋器下, 由於這樣能夠減小輸入次數性能

 

import和from import區別
  假設有模塊A和模塊B,在模塊B中使用import和from import引入模塊A

  使用importspa

  import A
  A.funcA() 
  #使用的funcA()依然是A模塊的,雖然在模塊B的代碼中,但其命名空間依然是在模塊A,若是對模塊A的funcA()進行修改,是會影響到其在模塊B的使用的

  使用from importcode

  from A import funcA
  funcA() 
  #funcA()已是A模塊的funcA()了,該函數存在於模塊B的全局命名空間,若是對模塊A的funcA()進行修改,是不會影響到其在模塊B的使用的

  所以,減小使用from xxx import XXX,特別是from xxx import * 這樣的使用模式。後者將會污染全局命名空間blog

相關文章
相關標籤/搜索