@(python)
模塊封包組織代碼
如下一個(gè)包的層級(jí)組成:
├── module_a.py
├── package_bc
│ ├── __init__.py
│ ├── module_b.py
│ ├── module_c.py
│ └── package_sub
│ ├── __init__.py
│ └── module_s.py
├── package_de
│ ├── __init__.py
│ ├── module_d.py
│ └── module_e.py
└── test.py
每個(gè)文件夾對(duì)應(yīng)一個(gè)包,包里面可以包含多個(gè)包,對(duì)應(yīng)的每個(gè) .py 文件是一個(gè)具體模塊。
封裝成包,在文件上組織好代碼后,確保每個(gè)目錄都要一個(gè) __init__.py
文件即可; 默認(rèn)這個(gè)文件是空的,在 import 對(duì)應(yīng)包的時(shí)候會(huì)被調(diào)用,也可以在其中寫入其他語(yǔ)句作為導(dǎo)入包的初始化設(shè)置,如下
# package_de/__init__.py
#!/usr/bin/env python
# coding=utf-8
# by orientlu
from . import module_d
from .module_e import module_e_fun
if __name__ == "__main__":
pass
在導(dǎo)入包的時(shí)候就把其下子模塊導(dǎo)入了。注意導(dǎo)入兩個(gè)模塊的寫法的細(xì)微差異,再導(dǎo)入后的調(diào)用方式上的差別。
對(duì)于多個(gè) .py 文件分別定義了多個(gè)類,但是想把這幾個(gè)文件歸屬為一個(gè)模塊的時(shí)候,可以參考 module_e 導(dǎo)入方式。
對(duì)于上述層次結(jié)構(gòu)的模塊組織,調(diào)用各個(gè)包下模塊示例 :
## test.py
#!/usr/bin/env python
# coding=utf-8
# by orientlu
import module_a as ma
import package_bc.module_c
import package_bc.module_b as mb
import package_bc.package_sub.module_s as ms
import package_de
if __name__ == "__main__":
ma.module_a_fun()
mb.module_b_fun()
package_bc.module_c.module_c_fun()
ms.module_s_fun()
package_de.module_d.module_d_fun()
package_de.module_e_fun()
限制模塊導(dǎo)入所有的內(nèi)容
一般不推薦
from module import *
, 導(dǎo)入很多不用的模塊內(nèi)容容易污染當(dāng)前的命名空間。
如果模塊里面什么都沒(méi)做,執(zhí)行上述語(yǔ)句會(huì)導(dǎo)入模塊中所有不以下劃線開(kāi)頭的函數(shù),變量。
通過(guò)在模塊中添加語(yǔ)句
__all__ = ['fun1', 'fun2']
進(jìn)行限制