Preface
__init__.py 文件的作用是將文件夾變為一個Python模塊,Python 中的每個模塊的包中,都有 __init__.py 文件。通常 __init__.py 文件為空,但是我們還可以為它增加其他的功能。我們在導入一個包時,實際上是導入了它的 __init__.py 文件。這樣我們可以在 __init__.py 文件中批量導入我們所需要的模塊,而不再需要一個一個的導入。
- # mt/__init__.py
- # __init__.py
- import re
- import urllib
- import sys
- import os
- # mt/a.py
- import mt
- print(mt.re, mt.urllib, mt.sys, mt.os)
- # mt/__init__.py
- __all__ = ['os', 'sys', 're', 'urllib']
- # mt/a.py
- from package import *
當導入模塊時,解釋器按照 sys.path 列表中的目錄順序來查找導入文件:
其中 list 第一個元素空字符串代表當前目錄。
關於.pyc 文件與.pyo 文件
.py 文件的彙編,只有在 import 語句執行時進行,當 .py 文件第一次被導入時,它會被編譯為 binary,並將結果寫入同名的 .pyc 文件中。後來每次導入操作都會直接執行 .pyc 文件(當 .py 文件的修改時間發生改變,這樣會生成新的 .pyc 文件),在解釋器使用 -O 選項時,將使用同名的 .pyo 文件,這個文件去掉了斷言(assert)、斷行號以及其他調試信息,體積更小,運行更快。(使用 -OO 選項,生成的 .pyo 文件會忽略文檔信息)
導入模塊
模塊通常為單獨的 .py 文件,可以用 import 直接引用,可以作為模塊的文件類型有 .py、.pyo、.pyc、.pyd、.so、.dll. 在導入模塊時,解釋器做以下工作:
import 語句可以在程序的任何位置使用,你可以在程序中多次導入同一個模塊,但模塊中的代碼僅僅在該模塊被首次導入時執行。後面的 import 語句只是簡單的創建一個到模塊名字空間的引用而已。sys.modules 字典中保存著所有被導入模塊的模塊名到模塊對象的映射。
導入包
多個相關聯的模塊組成一個包,以便於維護和使用,同時能有限的避免命名空間的衝突。一般來說,包的結構可以是這樣的:
- # tree mt/
- mt/
- ├── a.py
- ├── a.pyc
- ├── __init__.py
- └── __init__.pyc
- 0 directories, 4 files
- import re
- import sys
- __all__ = ['re', 'sys']
- print('{} is loaded'.format(__file__))
- from mt import *
- class Person:
- def __init__(self, name):
- self.name = name
- def __str__(self):
- return "Person({})".format(self.name)
- print('{} is executed'.format(__file__))
Supplement
* Python Tutorial Doc - Modules
沒有留言:
張貼留言