一:介紹
模塊定義:模塊就是實現了某個功能的代碼集合,一個模塊可以定義函數,類和變量。模塊還可以包括可運行的代碼。
優點:代碼重用,可維護性高
語法:
導入單一模塊:
import module_name
導入多個模塊
import module_name1,module_name2,......
調用符號:.
import os print(os.sep) print(os.getcwd())
模塊與文件關係:一個.py文件即一個模塊,反之亦然。
對於一個模塊test有如下定義: 模塊的文件名:test.py 模塊名:test 模塊導入:import test
二:模塊的名稱空間(作用域)
定義:名稱空間就是一個從名稱到對象的關係映射,每個模塊都定義了自己的名稱空間,即每個模塊有自己獨立的作用域。
分類:python程序在運行時具有三個名稱空間,內建(__builtin__模塊),全局,局部,python解釋器先加載內建名稱空間,後加載全局名稱空間,最後加載局部名稱空間。
名稱空間與作用域關係:從內往外找,以較內層作用域爲準
示例一:
module_a.py
x=1 def test(): print('from the module module_a') module_b.py內容如下
module_b.py
x=2 def test(): print('from the module module_b')
test.py
import module_a import module_b print(module_a.x) print(module_b.x) print(module_a.x+module_b.x) module_a.test() module_b.test() 運行結果: 1 2 3 from the module module_a from the module module_b
示例二:
module_a.py
x=1 def test(): print('from the module module_a',x)
test.py
import module_a x=2 print(child_module.x) child_module.x=10 print(child_module.x)
三:模塊的搜索路徑和路徑搜索
模塊導入需要經歷路徑搜索的過程,路徑搜索就是在你預定義的搜素路徑裏查找你想要導入的模塊
如果在預定義路徑爲找到,拋出異常(pycharm的特殊功能除外)
自定義模塊b在父級目錄裏(如有特殊需要可以使用sys.path.insert()方法)
解決:
import sys,os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import b b.test()
四:from-import語句和as
五:包
定義:包就是一組模塊的集合
包與目錄的區別:包必須包含一個空文件(也可以有內容)__init__
六:阻止屬性導入
如果你不想讓某個模塊屬性被 "from module import *" 導入 , 那麼你可以給你不想導入的屬性名稱加上一個下劃線( _ )。 不過如果你導入了整個模塊或是你顯式地導入某個屬性這個隱藏數據的方法就不起作用了。
示例一:
module_test.py
def foo(): print('from the func foo') def _bar(): print('from the func bar')
test.py
from child_module import * foo() bar() 拋出異常: NameError: name 'bar' is not defined
示例二:
module_test.py
def foo(): print('from the func foo') def _bar(): print('from the func bar')
test.py
from child_module import _bar _bar() 正常運行
七:導入循環(交叉引用)與import原理
導入循環:兩個模塊互相導入
import原理:將導入的模塊執行一遍
在python開發過程中,應儘量避免導入循環(交叉引用),但是,如果你開發了大型的 Python 工程, 那麼你很可能會陷入這樣的境地。
解決方法:
將 import 語句移到函數的內部,只有在執行到這個模塊時,纔會導入相關模塊。
錯誤示範:
b.py
import os import a def get_size(file_path): if a.file_exists(file_path): file_size=os.path.getsize(file_path) print('the file %s size is[%s]' %(file_path,file_size))
a.py
import os import b def file_exists(file_path): return os.path.isfile(file_path) def download(file_path): b.get_size(file_path) print('download file %s' %file_path) def upload(file_path): print('upload file %s' %file_path) download('a.txt')
解決方法:修改b.py
import os def get_size(file_path): import a if a.file_exists(file_path): file_size=os.path.getsize(file_path) print('the file %s size is[%s]' %(file_path,file_size))
a.py不變
import os import b def file_exists(file_path): return os.path.isfile(file_path) def download(file_path): b.get_size(file_path) print('download file %s' %file_path) def upload(file_path): print('upload file %s' %file_path) download('a.txt')