Python知識點記錄二(包和模組)

來源:互聯網
上載者:User

標籤:目前的目錄   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知識點記錄二(包和模組)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.