1. 程式人生 > >Python中的__init__與__main__

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__