python包模块import和from及__all__

1 python包模块import和from及__all__

python指定导入目录路径,称为包导入。

通过import和from导入包模块。

通过__all__指定导入的模块和导入的模块属性。

1.1 python包import和from

用法

import dir1.dir2.mod
from dir1.dir2 import mod
from dir1.dir2.mod import x

描述

NO 内容 描述
1 点号分隔 包导入的路径以点号分隔,点号对应机器路径分隔符。
2 目录关系 包名对应机器目录,左边为父目录,右边为子目录。
3 搜索路径 dir1所在父目录必须在模块搜索路径中。
4 init.py 包导入的路径(目录)必须存在__init__.py,才能导入成功。init.py内容可以为空和非空。
5 包初始化 首次导入包时,自动执行__init__.py文件内容。
6 模块初始 import dir1.dir2.mod返回模块对象,包含__init__.py的全部变量。
7 import import dir1.dir2.mod后,每次使用都需要写全路径:dir1.dir2.mod.x,如果路径有变更,每处使用的地方都要修改。
8 from from dir1.dir2 import mod,使用不需写全路径:mod.x,如果路径有变更,只需修改from一处。
9 as 通过as给import包取别名,简化书写。

示例

# dir1\__init__.py
print('在dir1\__init__.py')
a = 1
# dir1\dir2\__init__.py
print('在dir1\dir2\__init__.py')
b = 2
# dir1\dir2\mod.py
print('在dir1\dir2\mod.py')
s = '梯阅线条'
# 在 idle 执行下面示例
>>> import os
>>> path=r'E:\documents\F盘'
>>> os.chdir(path)
# 首次导入自动执行__init__.py
>>> import dir1.dir2.mod
在dir1\__init__.py
在dir1\dir2\__init__.py
在dir1\dir2\mod.py
>>> dir1.dir2.mod.s
'梯阅线条'
# 再次导入不再执行__init__.py
>>> import dir1.dir2.mod
# 修改py文件
# dir1\__init__.py
print('修改在dir1\__init__.py')
a = 1
# dir1\dir2\__init__.py
print('修改在dir1\dir2\__init__.py')
b = 2
# dir1\dir2\mod.py
print('修改在dir1\dir2\mod.py')
s = '修改梯阅线条'
# 在 idle 执行下面示例
# 直接import不会执行修改后代码
>>> import dir1.dir2.mod
>>> dir1.dir2.mod.s
'梯阅线条'
# reload 模块或包重新执行对应__init__.py最新代码
>>> reload(dir1.dir2.mod)
修改在dir1\dir2\mod.py
>>> dir1.dir2.mod.s
'修改梯阅线条'
<module 'dir1.dir2.mod' from 'E:\\documents\\F盘\\dir1\\dir2\\mod.py'>
>>> reload(dir1.dir2)
修改在dir1\dir2\__init__.py
<module 'dir1.dir2' from 'E:\\documents\\F盘\\dir1\\dir2\\__init__.py'>
>>> reload(dir1)
修改在dir1\__init__.py
<module 'dir1' from 'E:\\documents\\F盘\\dir1\\__init__.py'>
# 模块对象 包含__init__.py 全部顶层变量
>>> dir1.a
1
>>> dir1.dir2.b
2
# import 需要写全路径,否则找不到模块对象
>>> dir2.mod.s
Traceback (most recent call last):
  File "", line 1, in <module>
    dir2.mod.s
NameError: name 'dir2' is not defined
# from 不需写全路径,只需写import后面变量即可
>>> from dir1.dir2 import mod
>>> mod.s
'修改梯阅线条'
# as 给包路径取别名,通过别名访问模块对象属性
>>> import dir1.dir2.mod as md
>>> md.s
'修改梯阅线条'

1.2 python模块__all__列表

用法

# moda.py
__all__ =['v1','myprint',]

描述

python用from module import *导入模块属性时:

NO 描述
1 模块已定义__all__列表,则只导入__all__列表内的属性、方法、类
2 模块未定义__all__列表,则导入模块的全部顶层属性
3 __all__写在import语句下面

示例

# E:\documents\F盘\moda.py
import sys
__all__ =['v1','myprint',]
print('模块__all__')
v1 = '梯阅线条'
v2 = 'tyxt.work'

def myprint():
    print(v2)
    
def myecho():
    print(v1)
    
# 在 idle 执行下面示例
>>> import os
>>> path=r'E:\documents\F盘'
>>> os.chdir(path)
>>> from moda import *
模块__all__
# 可以访问 __all__ 列表属性
>>> v1
'梯阅线条'
# 不可访问 __all__ 列表外属性
>>> v2
Traceback (most recent call last):
  File "", line 1, in <module>
    v2
NameError: name 'v2' is not defined
>>> myprint()
tyxt.work
>>> myecho()
Traceback (most recent call last):
  File "", line 1, in <module>
    myecho()
NameError: name 'myecho' is not defined

1.3 python包__all__列表

用法

# __init__.py
__all__ = ['dir1moda',]

描述

python用from dir1 import * 导入包模块时:

NO 描述
1 init.py已定义__all__列表,则只导入__all__列表内的模块。
2 init.py未定义__all__列表,则不会自动导入任何模块,只导入包,可以在__init__.py手动导入模块。
3 __all__写在import语句下面

示例

# 目录结构:
# --dir1
# ----__init__.py
# ----dir1moda.py
# ----dir1modb.py
# E:\documents\F盘\dir1\dir1moda.py
print('在E:\documents\F盘\dir1\dir1moda.py')
# E:\documents\F盘\dir1\dir1modb.py
print('在E:\documents\F盘\dir1\dir1modb.py')
# E:\documents\F盘\dir1\__init__.py
import sys
__all__ = ['dir1moda',]
print('修改在dir1\__init__.py')
a = 1
# 在 idle 执行下面示例
>>> import os
>>> path=r'E:\documents\F盘'
>>> os.chdir(path)
>>> from dir1 import *
修改在dir1\__init__.py
在E:\documents\F盘\dir1\dir1moda.py
# 在 __all__ 列表内的模块被自动导入,可访问
>>> dir1moda.s
'在E:\\documents\\F盘\\dir1\\dir1moda.py'
# 非 __all__ 列表内的模块不自动导入,不可访问
>>> dir1modb.s
Traceback (most recent call last):
  File "", line 1, in <module>
    dir1modb.s
NameError: name 'dir1modb' is not defined
# 修改__init__.py文件:E:\documents\F盘\dir1\__init__.py,删除__all__
import sys
print('修改在dir1\__init__.py')
a = 1
# 重启 idle 执行下面示例
>>> import os
>>> path=r'E:\documents\F盘'
>>> os.chdir(path)
>>> from dir1 import *
修改在dir1\__init__.py
# 未定义__all__ ,不自动导入任何模块,不可访问
>>> dir1moda.s
Traceback (most recent call last):
  File "", line 1, in <module>
    dir1moda.s
NameError: name 'dir1moda' is not defined
>>> dir1modb.s
Traceback (most recent call last):
  File "", line 1, in <module>
    dir1modb.s
NameError: name 'dir1modb' is not defined
# 修改__init__.py文件:手动导入模块
import sys
from dir1 import dir1moda
print('修改在dir1\__init__.py')
a = 1
# 重启 idle 执行下面示例
>>> import os
>>> path=r'E:\documents\F盘'
>>> os.chdir(path)
>>> from dir1 import *
在E:\documents\F盘\dir1\dir1moda.py
修改在dir1\__init__.py
# __init__.py 手动导入模块,可访问
>>> dir1moda.s
'在E:\\documents\\F盘\\dir1\\dir1moda.py'
>>> dir1modb.s
Traceback (most recent call last):
  File "", line 1, in <module>
    dir1modb.s
NameError: name 'dir1modb' is not defined

你可能感兴趣的:(python,python)