Python模块包中__init__.py文件的作用(转载)
用django做開發(fā)已經(jīng)一年多的時(shí)間,但基本沒注意python模塊中__init__.py文件存在的意義,偶然看到對它的介紹嚇一大跳,這個(gè)文件太重要了
模塊包:
包通常總是一個(gè)目錄,目錄下為首的一個(gè)文件便是 __init__.py。然后是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那么它就是這個(gè)包的子包了。差不多就像這樣吧:
Package1/ __init__.py??? Module1.py??? Module2.py??? Package2/ __init__.py?????? Module1.py?????? Module2.py
我們可以就這樣導(dǎo)入一個(gè)包:
import Package1
或者調(diào)入一個(gè)子模塊和子包:
from Package1 import Module1from Package1 import Package2import Packag1.Module1import Packag1.Package2
可以深入好幾層包結(jié)構(gòu):
from Package1.Package2 import Module1import Package1.Package2.Module1
大致就這樣吧,我覺得,包的精髓應(yīng)該是在 __init__.py 這個(gè)文件之中的。
__init__.py 文件:
__init__.py 控制著包的導(dǎo)入行為。假如 __init__.py 為空,那么僅僅導(dǎo)入包是什么都做不了的。
>>> import Package1>>> Package1.Module1Traceback (most recent call last): File "<pyshell#1>", line 1, in ?? Package1.Module1AttributeError: 'module' object has no attribute 'Module1'
我們需要在 __init__.py 里把 Module1 預(yù)先導(dǎo)入:
#文件 __init__.pyimport Module1
測試:
>>> import Package1>>> Package1.Module1<module 'Package1.Module1' from 'Module.pyc'>
__init__.py 中還有一個(gè)重要的變量,叫做 __all__。我們有時(shí)會(huì)使出一招“全部導(dǎo)入”,也就是這樣:
from PackageName import *
這時(shí) import 就會(huì)把注冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導(dǎo)入到當(dāng)前作用域中來。比如:
#文件 __init__.py__all__ = ['Module1', 'Module2', 'Package2']
測試:
>>> from Package1 import *>>> Module2<module 'Package1.Module2' from 'Module.pyc'>
__init__.py 文件會(huì)在導(dǎo)入時(shí)被執(zhí)行。
轉(zhuǎn)載于:https://www.cnblogs.com/licheng/archive/2010/12/06/1897426.html
總結(jié)
以上是生活随笔為你收集整理的Python模块包中__init__.py文件的作用(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之Handler用法总结(
- 下一篇: python import