標籤:目前的目錄 ade loader 就是 color 包名 print style __name__
包和模組
1、Python項目的組織圖
Python最頂級的層級是包,模組即是包下的各個python檔案。從組織的層面考慮,模組應該為各種功能“類”。
2、包和檔案夾的不同
*包在形式上就是一個檔案夾,但作為包,包內必須含有一個“__init__.py”模組,同時這個“__init__.py”在Python解譯器運行時其名字就是包名。
*當一個包被匯入,或者該包內的某個模組,或者該包下某個模組內的變數/函數被匯入的時候,包內的__init__模組會被解譯器自動運行。
*在包內的__init__.py內可以通過定義__all__ = [‘包內模組名‘的字串列表],設定包內哪些模組可以被外部匯入。
3、import、from/import的用法
*對於直接使用import的匯入方法,import後面只能跟模組名,不能直接匯入模組內的變數或函數等!
*可以通過from/import的方式直接匯入模組內的變數或函數等。如包test下的模組x中的變數m可以用以下方式匯入使用:
import test.xprint(test.x.m)from test.x import mprint(m)from test import xprint(x.m)
*如果要匯入包test下模組x中的所有變數、函數;那麼可以用:from test import * 。但不推薦這種方法,這會使得匯入不夠明確。
如果要匯入模組x中的部分變數,則可以在模組x中通過設定__all__=[可匯入變數/函數名組成的字串列表]
__all__ = [‘a‘,‘c‘] a = 2c = 3d = 5 #d不在_all_列表中,所以無法匯入其他模組中使用
或者直接:from test import a,c
4、模組內建函數
任意模組的內建函數可以通過dir()方法顯示。
#模組a = 1print(dir())
#列印出上述模組的內建變數#其中可以發現變數a為自訂的變數,其餘為系統內建的變數[‘__annotations__‘, ‘__builtins__‘, ‘__cached__‘, ‘__doc__‘, ‘__file__‘, ‘__loader__‘, ‘__name__‘, ‘__package__‘, ‘__spec__‘, ‘a‘]
(1)__name__:當前的模組名稱。當該模組本身為入口模組時,名稱會變成‘__main__‘。
(2)__package__:當前模組所屬的包名,當模組為入口模組時,則不存在其上層的頂級包,則返回None。
(3)__doc__:當前模組的文檔注釋,如果模組沒有文檔注釋,則返回None。
(4)__file__:當前模組的路徑資訊。
#t.t1.c9‘‘‘This is T-t1-c9‘‘‘print(‘t-t1-c9-NAME:‘+__name__)print(‘t-t1-c9-PACKAGE:‘+(__package__ or ‘當前模組不屬於任何包‘))print(‘t-t1-c9-DOC:‘+(__doc__ or ‘當前模組沒有文檔注釋‘))print(‘t-t1-c9-FILE:‘+__file__)#t.c15import t.t1.c9print(‘t-c15-NAME:‘+__name__)print(‘t-c15-PACKAGE:‘+(__package__ or ‘當前模組不屬於任何包‘))print(‘t-c15-DOC:‘+(__doc__ or ‘當前模組沒有文檔注釋‘))print(‘t-c15-FILE:‘+__file__)#運行c15的結果:‘‘‘This is __init__.py file of PACKAGE t.t-t1-c9-NAME:t.t1.c9t-t1-c9-PACKAGE:t.t1t-t1-c9-DOC:This is T-t1-c9t-t1-c9-FILE:D:\...\seven\t\t1\c9.pyt-c15-NAME:__main__t-c15-PACKAGE:當前模組不屬於任何包t-c15-DOC:當前模組沒有文檔注釋t-c15-FILE:D:\...seven\c15.py
5、__name__變數的經典應用
#Make a script both importable or excutable#使得一個模組既可以作為普通模組也可以作為可執行程式if __name__ == ‘__main__‘: pass
#c17if __name__ == ‘__main__‘: print(‘This is app.‘)print(‘This is a module.‘) #c16import c17print(‘test‘)#運行c16的結果:This is a module.test#運行c17的結果:This is app.This is a module.
6、相對匯入和絕對匯入
任意模組其所屬的頂級包,都和當前入口程式相關,模組的頂級包最多隻上升到入口程式的平級層次。
入口程式不屬於任意包。
如果有一個python項目,其包括main.py和package1、package2、package3;其中package2包中又有package4包,package4包內有模組m2.py。
如果以main.py作為入口檔案,其中需要匯入m2模組,則:
#main.py#這裡的“package2.package4.m2”即為絕對匯入import package2.package4.m2
對於相對匯入:一個點‘.‘表示目前的目錄,兩個點‘..‘表示目前的目錄上一層目錄,三個點‘...‘表示目前的目錄上上層目錄,以此類推。
在入口程式中不能使用相對匯入,因為相對路徑能找到對應模組是在於其會通過所在模組的‘__name__‘來定位;而對於入口檔案,其__name__會被改成‘__main__‘,在目錄中是找不到‘__main__‘這個檔案的。
import匯入文法也不能使用相對匯入,只能在from/import中使用。
#絕對匯入一定是從頂級包開始import package2.package4.m2#相對匯入#匯入該模組同級目錄下m3模組的變數afrom .m3 import a#匯入該模組統計目錄下package5包下m3包下的變數afrom .package5.m3 import a#匯入該模組同級目錄下package5包下的m3模組from .package5 import m3#匯入該模組上級目錄下m4模組內的p變數from ..m4 import p
Python知識點記錄二(包和模組)