Python在處理功能複用和功能顆粒度劃分時採用了類、模塊、包的結構。 python
類:類的概念在許多語言中出現,很容易理解。它將數據和操做進行封裝,以便未來的複用。類寫在模塊裏。 app
模塊:一般是一個python文件,定義了某些函數和變量。你在其餘須要這些功能的文件中,導入這模塊,就可重用這些函數和變量。通常用module_name.fun_name,和module_name.var_name進行使用。 函數
包:包對應於文件夾,包含許多模塊。咱們通常將某些功能相近的模塊放在同一個包中。使用包的方式跟模塊也相似,惟一須要注意的是,當文件夾看成包使用時,文件夾須要包含__init__.py文件,主要是爲了不將文件夾名看成普通的字符串。__init__.py的內容能夠爲空,通常用來進行包的某些初始化工做或者設置__all__值,__all__是在from package-name import *這語句使用的,所有導出定義過的模塊。 this
work:#工做目錄 package1 __init__.py module1.py func1() package2 __init__.py module2.py func2() main.py main()#主程序
首先須要找到module2,用以下代碼聲明mudule2路徑(實際上是將mudule2路徑加入到sys.path中): spa
#__init__.py import os import sys sys.path.append(os.getcwd()+"\\package2\\module2")此時,能夠在module1中調用func2:
#module.py from package2.module2 import func2 def func1(): func2() print "This is func1" ...注意:此時運行module1會報錯,若查看sys.path可看到咱們添加的路徑變爲..\working\package1\package2\module2,顯然,這個路徑並非module2的路徑,原來錯誤在這裏,那麼到底怎麼回事呢?記得os.getcwd()嗎,它是返回當前運行模塊所在目錄,而咱們運行mudule1,所以...
# main.py from package1.module1 import func1 def main(): func1() if __name__ == "__main__": main()注意:i) 此時從main.py調用func1,並無事先聲明module1的路徑
ii) 運行main.py, 你猜,程序可以正確運行麼?沒錯,此時,能夠獲得正確的輸出。 code
#假如 func2 的功能是打印一條 「this is func2」 #輸出以下: This is func2 This is func1
不須要添加路徑,利用__all__,參考博文 字符串
具體操做爲,在每一個包的__init__.py文件中用__all__指定要引用的模塊。如: get
# package1\__init__.py __all__=["module1"] #package2\__init__.py __all__=["module2"]