使用from <module> import *
導入模塊時,若顯式定義了__all__
,則只導入__all__
中的name,否則會導入除以下划線開頭的所有name
文件目錄結構
|---main.py
|---module.py
定義module文件:
# __all__ in a module, means that when you import * from the module, only those names in the __all__ will imported __all__ = ['hello', 'Person', '__private'] _internal = 'internal' __private = 'private' class Person(): def __init__(self): print('init person') def hello(): print('hello') def world(): print('world')
導入模塊:
import module module.Person() module.hello() # 可以訪問以下划線開頭的name print(module._internal) module.world() # ====================================== from module import * Person() hello() print(__private) # NameError: name 'world' is not defined # world() # NameError: name '_internal' is not defined print(_internal)
import package
package中的__init__.py
文件會影響到包文件的導入
文件目錄結構
|---main.py
|---packages
|---__init__.py
|---pkg.py
__init__.py
為空,main.py
:
import packages.pkg as ppkg ppkg.Package() ppkg._internal # ============================================= from packages import pkg pkg.Package() # ============================================= # 不會導入任何name from packages import *
__init__.py
中指定模塊name
__init__.py
__all__ = ['pkg']
main.py
:
import packages.pkg as ppkg ppkg.Package() ppkg._internal # ============================================= from packages import * pkg.Package() pkg._internal
__init__.py
中導出模塊中的部分名稱
__init__.py
:
from pkg import * __all__ = ['Package', 'init']
main.py
import packages as pg pg.Package() # ============================================ from packages import Package Package() # ============================================= from packages import pkg # AttributeError: 'function' object has no attribute 'Package' # pkg.Package() # ============================================= from packages import * Package() init() # name 'pkg' is not defined # pkg.Package() # pkg._internal
對於package的導入,若
__init__.py
不為空,則只能導入__init__.py
中指定的模塊(中的)name;
__init__.py
為空時,通過from package import *
推薦閱讀