15 june 2015
當你從python直譯器退出後再重新進入, 之前所寫的**,包括變數、函式都已經不存在了,如果你想週期性的執行這些功能但是並不想每次都將這些**重新輸入一遍,你可以將這些**儲存成檔案在本地進行儲存(也就是指令碼),當你寫的程式規模越來越大,維護起來越發吃力,你或許會想把它分割為不同功能的檔案,再或者你需要在其他專案中需要復用這些**時不想將這些**ctrl+c、ctrl+v,與c語言中的那些按功能劃分的.h、.c檔案類似,python也提供了模組和包用來提高**復用率以及降低**規模。
模組就是乙個python(以.py為字尾)檔案,在模組中可以定義類、函式以及變數。通過import匯入就可以在你寫的**中使用模組中的內容。
模組的匯入
除了import module這種用法之外,還有其他的一些使用方法,比如:from module import *,這種匯入方法把模組(module)的所有內容全都匯入,再比如:from module import name,這種用法可以讓你從模組(module)中匯入乙個指定的部分(name)到當前命名空間中,使用from…import…語句可以避免在程式中使用字首符,比如說,from module import name時,當需要使用name時,不需要通過module.name這種方式,只需要直接使用name就可以了。
模組的屬性
使用dir函式可以列出模組定義的識別符號,識別符號有函式、類和變數等等,以copy模組為例:
>>> dir(copy)
["error", "pystringmap", "_emptyclass", "__all__", "__builtins__", "__doc__", "__file__", "__name__", "__package__", "_copy_dispatch", "_copy_immutable", "_copy_inst", "_copy_with_constructor", "_copy_with_copy_method", "_deepcopy_atomic","_deepcopy_dict", "_deepcopy_dispatch", "_deepcopy_inst", "_deepcopy_list", "_deepcopy_method", "_deepcopy_tuple", "_keep_alive", "_reconstruct", "_test", "copy", "deepcopy", "dispatch_table", "error", "name", "t", "weakref"]
>>> copy.__all__
["error", "copy", "deepcopy"] `__all__`屬性定義了模組的公有介面,當你使用`from module import *`時你只能使用`__all__`變數中的幾個成員,當使用`import module`時,便可以獲得模組中所有不以下劃線開頭的屬性。模組中可能會有許多其他程式根本不會需要的屬性,`__all__`會把它們過濾掉。 help函式和`__doc__`屬性用於獲得幫助的文件:help(copy)和`copy.__doc__`。 `__file__`屬性可以輸出模組的源**位置。 ## 系統路徑 首先你需要知道平時我們使用的模組都是在哪些位置,換句話說,哪些資料夾中的**可以被import,通過下面的**可以列印出系統路徑,也就是說在`sys.path`中的模組都是可以被import的。
>>>import sys
>>>print sys.path
["", "c:\windows\system32\python27.zip", "c:\python27\dlls", "c:\python27\lib", "c:\python27\lib\plat-win", "c:\python27\lib\lib-tk", "c:\python27", "c:\python27\lib\site-packages"]
模組的搜尋路徑
在匯入模組時模組的搜尋路徑就是按照sys.path中的順序(上一節系統路徑中列印出來的順序),首先是空字串,空字串代表代表當前目錄(如果是在指令碼中列印出來的話,可以更清楚地看出是哪個目錄),接下來是python本身的那些庫的位置。
使用自己編寫的模組
假設你從之前的專案中抽取了一些基本的功能編寫成模組(假設名字為tobecalled.py),當你在新的專案(名為projectnow)中的call.py需要使用它時,你可以複製tobecalled.py到你當前專案的資料夾中,目錄結構如下:
projectnow
-call.py
-tobecalled.py 在call.py中你通過`import tobecalled`就可以使用tobecalled模組中的類或者函式了。這種方法每當你需要在新的專案中使用tobecalled模組時你都需要拷貝乙份到新的專案中,而且當你修改了tobecalled中的bug之後,所有它的備份都需要被修改,維護的難度比較大。所以這種做法不是特別推薦。 使用這種方法時有個需要注意的問題是當你在命名你的模組時盡量不要和標準的模組重名,因為模組的搜尋路徑中當前目錄的優先順序是最高的,所以會覆蓋標準的模組,你可以通過`.__file__`獲取你匯入的包的真實路徑。 比較好的做法就是你將tobecalled模組拷貝到系統路徑中,這樣在你所有的專案中都可以import tobecalled,而且在後續的維護中也比較簡單。 ## 包 包是由一系列模組組成的集合,模組是處理某一類問題的函式和類的集合,`包必須至少含有乙個__int__.py檔案,內容可以為空,__int__.py標識當前資料夾是乙個包`,`__int__.py`其實就是乙個普通的python檔案,它會在包被匯入時執行,比如說(前提是packagename在系統路徑中):
packagename
-__int__.py
-module1.py
-module2.py 在上面的例子中,packagename是乙個包,因為在它裡面包含了`__int__.py`檔案,下面列出使用import匯入包中的模組時的方法,假如`__int__.py`為空,那麼僅僅匯入包是沒什麼用的;如果在`__init_.py`中匯入了module1的話,那麼`import packagename`之後module1是可用的(`通過packagename.module1使用`)。
import packagename # __init__中的內容為空時,module1和module2模組不可用
import packagename.module1 # module1可用,但只能使用packagename.module1來使用
from packagename import module2# module2可用,可通過module2直接使用 在上面的例子中可以看到,包在使用import時可以通過`點(.)`來訪問,比如`import packagename.module1`與`from packagename import module1`功能是一樣的,區別還是在於訪問時是否可以省去包名直接使用模組名進行訪問。
Python迴圈導包
版本 3.6.3 python不存在迴圈導包問題,或者說那些被稱之為迴圈導包問題的真正原因不是迴圈,真正原因是在使用乙個物件的時候還沒有獲取到這個物件 從報錯資訊也能看出這一點 不管是直接import還是from格式的導包,python都只載入一次被導的包,以後即使再有導包語句也不會真正的載入那個包...
idea導包都報錯 python 導包
python 導包 python語言的使用者對導包應該不會陌生,下面我們就一起看一下python中有哪些到爆方式 1 import 直接使用import進行導包是一種很常見的方式,每次可以匯入乙個或多個包,直接使用import導包相當於是匯入了這個模組的整體,這個模組包含的所有物件都可以呼叫,但是要...
python導包的過程 python中導包簡介
以pycharm中為例 1 建立乙個python package,就是建立乙個包,注意,建立directory和建立python package之間的不同,前者只是乙個資料夾,不是包,後者是包。包裡有乙個 init py模組自動被建立。這是包的乙個特性。2 在包裡建立乙個python file,即建...