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不存在也行。
以上,僅針對類而言!