python中import的相關知識總結

2021-08-30 06:03:17 字數 2963 閱讀 9790

1. import 實際上是python虛擬機器把當前的globals()和locals()傳進__builtins__.__import__內建函式了,所以實際上幹活的是那個__import__函式!

2. import對命名空間的影響

1)如果是python的內建模組,例如os模組。這些模組是隨著python虛擬機器啟動而載入進來的,但是並沒有暴露出來。我們可以通過dir()命令檢視當前命名空間

>>> dir()

['__builtins__', '__doc__', '__name__']

可以看到,並沒有看到像os,sys等模組。

但是我們如果執行import sys後,那就有了。

>>> import sys

>>> dir()

['__builtins__', '__doc__', '__name__', 'sys']

通過sys.modules這個字典(key: 模組名;value: 模組的路徑),我們可以檢視模組的資訊。再通過id函式,我們可以知道兩個sys模組是否為同乙個模組,如下:

>>> id(sys)

135708788

>>> id(sys.modules['sys'])

135708788

2)import只影響當前模組的命名空間

例如a.py裡面有一句import bb,  而bb.py裡面有一句import os,那麼可以這樣檢視

>>> import a

>>> dir()

['__builtins__', '__doc__', '__name__', 'a']

>>> dir(a)

['__builtins__', '__doc__', '__file__', '__name__', 'bb']

>>> dir(a.bb)

['__builtins__', '__doc__', '__file__', '__name__', 'os']

3. import package

首先合法的package必須含有乙個__init__.py檔案,package可以包含0個或多個module(py檔案)。假設aa資料夾中有test.py檔案和bb資料夾,bb資料夾裡面有c.py。那麼當import aa.bb.c的時候,究竟對命名空間產生什麼影響呢?

>>> import aa.bb.c

>>> dir()

['__builtins__', '__doc__', '__name__', 'aa']

>>> import sys

>>> for k,v in sys.modules.items():

... print k,'\t',v

...

aa

copy_reg __main__ site __builtin__ encodings encodings.encodings none

aa.bb.c

posixpath errno encodings.codecs none

encodings.latin_1 os.path _codecs stat zipimport warnings encodings.types none

userdict sys codecs readline types _types signal linecache posix encodings.aliases aa.bb

exceptions os

可以看到只是一句import aa.bb.c,卻把aa,aa.bb,aabb.c全部加入了當前命名空間。這種做法是為了防止重名的吧,因為如果不加字首的話,其他包裡面有重名的模組就不能識別了!原理是python現在當前命名空間查詢符號『aa』對應的object,然後再在它的命名空間查詢符號'bb',然後在bb的屬性(命名空間)裡面尋找c,所以,需要把aa,bb都載入進來。不過這些都是只載入一次的,不信的話,大家可以試一下再import aa.bb.d這樣的模組,同時預先在aa資料夾中的

__init__.py檔案中輸入print 『hello』,hello只在第一次import aa.bb.c的時候輸出!

4.from與import

1)例如:from aa import bb

>>> from aa import bb

>>> dir()

['__builtins__', '__doc__', '__name__', 'bb']

>>> import sys

>>> sys.modules['bb']

traceback (most recent call last):

file "", line 1, in keyerror: 'bb'

>>> sys.modules['aa.bb']

>>> bb

>>> aa.bb

traceback (most recent call last):

file "", line 1, in nameerror: name 'aa' is not defined

from import只是把import後面的名字引入了命名空間,讓我們可以更方便的 使用而已,但是內部實際上還是帶有模組名的。import 。。。as。。。也是同樣的道理了。

2)from 。。。import *

這種形式的import是不推薦的,因為很容易汙染命名空間。但是也可以了解一下。

首先如果package中的__init__.py檔案並沒有宣告__all__ 的值的話,from package import * 是沒有用的。因為python原始碼中的import_from_all這個函式估計會去讀__all__的值,然後再import。

而這種形式的import對命名空間的影響又是怎樣的呢?

答案是和import aa.bb.c那種一樣的。

python中的import介紹

coding changes the world accumulating makes yourself 感覺乙個 模組就是乙個物件啊,這個物件單元是專門用來處理某些需求的,作為乙個單獨模組引入 import語句作用 import語句作用就是用來匯入模組的,它可以出現在程式中的任何位置。import...

Python中import的使用

python中的import語句是用來匯入模組的,在python模組庫中有著大量的模組可供使用,要想使用這些檔案需要用import語句把指定模組匯入到當前程式中。import語句的作用 import語句作用就是用來匯入模組的,它可以出現在程式中的任何位置。import語句語法 使用import語句匯...

python中的import詳解

匯入也是一種啟動程式的方法。匯入從本質上講,就是載入另乙個檔案,並能夠讀取那個檔案的內容。更大的程式往往以多個模組檔案的形式出現。乙個模組檔案被設計成主檔案,或叫做頂層檔案 就是那個啟動後能夠執行整個程式的檔案 匯入必須找到檔案,將其譯成位元組碼,並且執行 模組往往就是變數名的封裝,被認作是命名空間...