Python中的__init__與__main__
目錄結構
sound/ Top-level package
__init__.py Initialize the sound package
__main__.py
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
effects/ Subpackage for sound effects
__init__.py
__main__.py
echo.py
surround.py
reverse.py
#sound/__main__.py #coding:utf_8 print 'sound.__main__' ############################ #effects/__main__.py #coding:utf_8 print 'effects.__main__' ############################ #echo.py #coding:utf_8 print 'echo' x='echo' ########################### #surround.py #coding:utf_8 print 'surround' z='surround' ########################### #reverse.py #coding:utf_8 print 'reverse' y='reverse'
一、在__init__.py中__all__
1、__all__列表可以填寫與該__init__.py同級的包(或模組)
如在sound/__init__.py的__all__中,可以這樣寫
__all__=["effects"]
在effects/__init__.py的__all__中,可以這樣寫
__all__=["echo"]
當使用 from package import *語句時,主程式只能獲得__all__中的屬性
#sound/__init__.py #coding:utf_8 print "sound.__init__" __all__=["effects"] from . import effects from . import formats ################################ #effects/__init__.py #coding:utf_8 print "effects.__init__" __all__=["echo"] from . import echo from . import reverse from . import surround
>>> from sound import *
sound.__init__
effects.__init__
echo
reverse
surround
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'effects']
#主程式獲得了'effects'
####################################################################
>>> from sound.effects import *
sound.__init__
effects.__init__
echo
reverse
surround
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'echo']
#主程式獲得了'echo'
2、如果想在__all__列表中填寫下幾級的包(或者模組、模組中的屬性),需要先在__init__.py將該包(或者模組、模組中的屬性)匯入才能使用
如在sound/__init__.py只中,可以這樣實現(在)
__all__=["x", "y"]
print "sound.__init__"
from .effects.echo import x
from .effects.reverse import y
或者
__all__=["echo", "reverse"]
print "sound.__init__"
from .effects import echo
from .effects import reverse
>>> from sound import *
sound.__init__
effects.__init__
echo
reverse
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'x', 'y']
#主程式獲得了'x'、'y'
##################################################################
>>> from sound import *
sound.__init__
effects.__init__
echo
reverse
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'echo', 'reverse']
#主程式獲得了'echo'、'reverse'
3、當sound/__init__.py和effects/__init__.py都定義了__all__,主程式獲得的是路徑最後面包的__all__中的屬性
#sound/__init__.py
#coding:utf_8
print "sound.__init__"
__all__=["x", "y"]
from .effects.echo import x
from .effects.reverse import y
######################################
#effects/__init__.py
#coding:utf_8
print "effects.__init__"
__all__=["z"]
from .surround import z
>>> from sound import *
sound.__init__
effects.__init__
echo
reverse
surround
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'x', 'y']
##################################################################
>>> from sound.effects import *
sound.__init__
effects.__init__
surround
echo
reverse
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'z']
4、如果沒有定義__all__,通過 from package import * 語句匯入時,主程式可以獲得在__init__.py定義的屬性
#sound/__init__.py
#coding:utf_8
print "sound.__init__"
#__all__=["effects"]
from . import effects
from . import formats
########################
#effects/__init__.py
#coding:utf_8
print "effects.__init__"
#__all__=["echo"]
from . import echo
from . import reverse
from . import surround
>>> from sound import *
sound.__init__
effects.__init__
echo
reverse
surround
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'effects', 'formats']
####################################################################################
>>> from sound.effects import *
sound.__init__
effects.__init__
echo
reverse
surround
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'echo', 'reverse', 'surround']
二:在模組檔案中定義的__all__,通過 from model import *語句匯入時,主程式獲得在__all__中的屬性
#echo.py
__all__=["x","a"]
print 'echo'
x='echo'
a=[1,2,3]
b=[4,5,6]
>>> from echo import *
echo
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'x']
三:__main__.py的用法
當通過python -m package 語句執行時,python 會先執行 __init__.py ,然後執行__main__.py
F:\autotest_selenium>python -m sound
sound.__init__
effects.__init__
surround
echo
reverse
sound.__main__
當通過python package 語句執行時,知會執行執行__main__.py
F:\autotest_selenium>python sound
sound.__main__