关于python导包的理解
2019-01-09 本文已影响81人
飞跑的蛤蟆
在python中,每个模块的包中,都有一个
__init__.py
的文件,有了这个文件,我们才能导入这个目录下的module。
那么它还有别的功能吗,答案是有的。其实,__init__.py
里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py
文件。我们可以先在__init__.py
文件中导入其他的包,或者模块。这样,当我们导入这个包的时候,__init__.py
文件自动运行。帮我们导入文件中写的信息,这样就可以减少代码量。
__init__.py
中还有一个重要的变量,叫做__all__
。在使用from PackageName import *
时,import就会把注册在包__init__.py
文件中__all__
列表中的子模块和子包导入当前作用域中来。
python中的包和模块有两种导入方式:精确导入和模糊导入
以上图为例,精准导入,假如settings.py
里有函数say_hello()
,say_hi()
。
此时start.py
需要引用它们,可以用以下的写法:
from settings.settings import say_hello,say_hi
假如方法比较多,就可以用模糊导入,而__all__
则可以控制*所表示要引入的东西(模块,类,函数,变量,常量等):
from settings.settings import *
image.png
但是如果将__all__
里的say_hi
去掉,start.py
中就会报say_hi
未定义的错误。
在__init__.py
中引入所有内容:
在setting
模块中的__init__.py
中用__all__
声明要引入的模块等信息。