python包中的 init.py 函數的含義和作用
包的導入
常見導入方式:
- import 包名.文件名(模塊).函數
2.from 包名 import 模塊名 - from 包名.模塊名 import 模塊中的函數、類、全局變量
常見問題:
- ① VSCode 運行python導入上級目錄模塊問題:
- 問題:
icoding 和 VSCode 等項目目錄的計算方式:將項目的根目目錄(工作目錄)作為標准來計算各個模塊、文件的相對路徑,但是python包導入時候經常出現問題
- 目錄結構
x目錄, y目錄, z.py在同一級下; x目錄下有x.py模塊, y目錄下有y.py模塊* rootpath: * x(文件夾) * __init__.py * x.py * y(文件夾) * __init__.py * y.py * z.py(python文件)
- 導包
- 1.z.py中導入 x.py 導入同級別的包, 導入x包的x模塊的printX函數
# x.py def printX(): print("這里是x") # z.py from x.x import printX printX()
- 2.x.py中導入 z.py 這屬於導入上級的包,需要使用sys模塊設定一下路徑為 .. 當前目錄上級,sys模塊一定要在z模塊前引入
# x.py import sys sys.path.append("..") import z z.printZ() # z.py def printZ(): print("這里是z")
- 3.y.py中導入x.py 這種情況跟x.py中導入z.py類似
# x.py def printX(): print("這里是x") # y.py import sys sys.path.append("..") from x.x import printX printX()
- 1.z.py中導入 x.py 導入同級別的包, 導入x包的x模塊的printX函數
- 問題:
python 中 init.py 文件
在創建python包的過程中,IDE都會在包根目錄下創建一個__init__.py文件,該Python文件默認是空的.目錄結構如下:
-
Pycharm下的package樹結構:
-
在Finder中的目錄結構:
-
從Finder中的目錄就可以看出來,每個package實際上是一個目錄(Directory),那么IDE是怎么識別它為package呢?沒錯,init.py的第一個作用就是package的標識,如果沒有該文件,該目錄就不會認為是package。
-
Python中的包和模塊有兩種導入方式:精確導入和模糊導入:
- 精確導入:
from Root.Pack1 import Pack1Class import Root.Pack1.Pack1Class
- 模糊導入:
模糊導入中的*中的模塊是由__all__來定義的,init.py的另外一個作用就是定義package中的__all__,用來模糊導入,如__init__.py: (init.py中不必要吧?)from Root.Pack1 import *
__all__ = ["Pack1Class","Pack1Class1"]
- 在包外部調用:
from Root.Pack1 import * a = Pack1Class.Pack1_AA("Alvin") a.PrintName()
- init.py首先是一個python文件,所有還可以用來寫python模塊,但是不建議這么寫,盡量保證__init__.py足夠輕:
__all__ = ["Pack1Class","Pack1Class1","Init_AA"] class Init_AA: def __init__(self,name): self.name = name def Greeting(self): print("Hello ",self.name)
- 在測試中調用:
from Root.Pack1 import * b = Init_AA("test") b.Greeting()
- 總結:
從上邊的例子可以看出,__init__.py的主要作用是: 1. Python中package的標識,不能刪除 2. 定義__all__用來模糊導入 3. 編寫Python代碼(不建議在__init__中寫python模塊,可以在包中在創建另外的模塊來寫,盡量保證__init__.py簡單)
- 精確導入: