包和模块
在这样一个工程中,pkg
是包(package),module1.py
和module2.py
是模块(module),在模块中还有定义的方法、变量等,可以统称为功能。
import可以导入包,也可以导入模块:
import pkg
import pkg.module1
import pkg.mudule2
导入功能则需要使用from:
from pkg.module1 import hello1
__init__.py
概述
在Python中,__init__.py
文件是一个特殊的文件,用于指示Python解释器该目录应该被视为一个Python包。这个文件可以为空,也可以包含初始化包的Python代码。
通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入:
# pkg
# __init__.py
import re
import urllib
import sys
import os
# main.py
import pkg
print(pkg.re, pkg.urllib, pkg.sys, pkg.os) # 注意这里访问__init__.py文件中的引用文件,需要加上包名。
__init__.py
中还有一个重要的变量,__all__
它用来将模块全部导入。
# pkg
# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']
# main.py
from package import *
导入包和使用模块
module1.py
:
def hello1():
print('hello, it\'s module1.py')
moudle2.py
:
def hello2():
print('hello, it\'s module2.py')
需要使用pkg
这个包时,可以在main.py
中直接通过import导入:
import pkg
pkg.moudle1.hello1()
pkg.moudle2.hello2()
也可以使用from语句导入:
from pkg import module1, moudle2
moudle1.hello1()
moudle2.hello2()
也可以只导入包中的某个模块或者函数:
from pkg.moudle1 import hello1
from pkg.moudle2 import hello2
hello1()
hello2()
控制导入行为
我们可以在__init__.py
文件中定义__all__
变量,指定包的公开接口,用来将模块导入。
__init__.py
文件可以什么都不写,但如果想使用from pkg import *
这种写法的话,需要在__init__.py
中加上:
__all__ = ['moudle1', 'moudle2']
如果修改__init__.py
:
__all__ = ['module1']
这样,在导入包时,只有module1模块会被导入。
main.py
:
from pkg import *
module1.hello1()
module2.hello2() # 由于module2没有被导入,所以会报错
https://geek-docs.com/python/python-ask-answer/845_python_using___init__py.html
https://www.cnblogs.com/BlueSkyyj/p/9415087.html