Python import 与 __all__
import module
使用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 *
无法导入任何name;
推荐阅读
Python Modules
Python Package
Python Namespace and Scope
Can someone explain all in Python?
以上是 Python import 与 __all__ 的全部内容, 来源链接: utcz.com/z/389111.html