python __init__.py导入
作者:互联网
python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。
那么,__init__.py还有什么别的功能呢?
其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
我们可以再__init__.py文件中再导入其他的包,或者模块。
[python] import readers import writers import commands import users import meta import auth import admin
这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。 不需要一个个去导入module了。 __init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样: from PackageName import * 这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如: #文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
__init__.py文件怎么写 可以什么都不写,但如果想使用from package1 import *这种写法的话,需要在__init__.py中加上:
__all__ = ['file1','file2'] #package1下有file1.py,file2.py
## 实验
#### 实验一 //a.py def index(): print("hello") //b.py import a a.index()
能跑
#### 实验二 //a.py def index(): print("hello") //b.py from a import index index()
能跑
#### 实验三 //test/a.py def index(): print("hello") //b.py from test.a import index index()
能跑
#### 实验四 //test/a.py def index(): print("hello")
//test2/b.py from test.a import index index()
不能跑
#### 实验五 //test/a.py def index(): print("hello") //test/b.py from . import index index()
#### 实验六 不能跑 ImportError: cannot import name 'index' .默认是从__init__.py获取 ## 参考 这篇文章讲的比较详细 https://blog.csdn.net/weixin_38256474/article/details/81228492
## 犯错: 1. 网上能找到很多诸如此类的错误,一般都是路径问题,还有个就是命名问题 2. 但新手最容易犯的错就是,,在a类中导入了b类,又在b类中导入了a类,比如我 3. 另一种错误是目录的下的文件和类重名,比如如下结构
views.py views/index.py views/__init__.py
4. 还有一种错误是本地包覆盖原有包 比如说本地的requests.py覆盖了requests库
## 总结 对于不在sys.path中,一定要避免用import导入 自定义包(package)的子模块(module),而要用from…import… 的绝对导入 或相对导入,且包(package)的相对导入只能用from形式。
反对所有回答,虽然它们没全错。假设该from . import x语句存在于proj/test.py中,它会导入同级目录下的__init__.py即proj/__init__.py中的x对象,如果没有proj/__init__.py或有那个文件但是文件中不存在x对象,就导入proj/x/__init__.py,如果还没有,就导入proj/x.py,还没有就报错。其中同级是按__name__的前一部分或 __package__ 确定的。如果用python proj/test.py运行,__name__就是__main__,__package__是None,就会报错。如果用python -m proj.test运行,虽然__name__还是__main__,但是__package__是proj,就能成功导入,即使proj/__init__.py不存在也行。
以上,仅针对类而言!
[python] import readers import writers import commands import users import meta import auth import admin
这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。 不需要一个个去导入module了。 __init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样: from PackageName import * 这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如: #文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
__init__.py文件怎么写 可以什么都不写,但如果想使用from package1 import *这种写法的话,需要在__init__.py中加上:
__all__ = ['file1','file2'] #package1下有file1.py,file2.py
## 实验
#### 实验一 //a.py def index(): print("hello") //b.py import a a.index()
能跑
#### 实验二 //a.py def index(): print("hello") //b.py from a import index index()
能跑
#### 实验三 //test/a.py def index(): print("hello") //b.py from test.a import index index()
能跑
#### 实验四 //test/a.py def index(): print("hello")
//test2/b.py from test.a import index index()
不能跑
#### 实验五 //test/a.py def index(): print("hello") //test/b.py from . import index index()
#### 实验六 不能跑 ImportError: cannot import name 'index' .默认是从__init__.py获取 ## 参考 这篇文章讲的比较详细 https://blog.csdn.net/weixin_38256474/article/details/81228492
## 犯错: 1. 网上能找到很多诸如此类的错误,一般都是路径问题,还有个就是命名问题 2. 但新手最容易犯的错就是,,在a类中导入了b类,又在b类中导入了a类,比如我 3. 另一种错误是目录的下的文件和类重名,比如如下结构
views.py views/index.py views/__init__.py
4. 还有一种错误是本地包覆盖原有包 比如说本地的requests.py覆盖了requests库
## 总结 对于不在sys.path中,一定要避免用import导入 自定义包(package)的子模块(module),而要用from…import… 的绝对导入 或相对导入,且包(package)的相对导入只能用from形式。
反对所有回答,虽然它们没全错。假设该from . import x语句存在于proj/test.py中,它会导入同级目录下的__init__.py即proj/__init__.py中的x对象,如果没有proj/__init__.py或有那个文件但是文件中不存在x对象,就导入proj/x/__init__.py,如果还没有,就导入proj/x.py,还没有就报错。其中同级是按__name__的前一部分或 __package__ 确定的。如果用python proj/test.py运行,__name__就是__main__,__package__是None,就会报错。如果用python -m proj.test运行,虽然__name__还是__main__,但是__package__是proj,就能成功导入,即使proj/__init__.py不存在也行。
以上,仅针对类而言!
标签:__,index,__.,python,py,init,import 来源: https://www.cnblogs.com/XUYICHENMO/p/15922484.html