python包中的 __init__.py 函數的含義和作用 & python包的導入


python包中的 init.py 函數的含義和作用

包的導入

常見導入方式:

  1. import 包名.文件名(模塊).函數
    2.from 包名 import 模塊名
  2. from 包名.模塊名 import 模塊中的函數、類、全局變量

常見問題:

  • ① VSCode 運行python導入上級目錄模塊問題:
    • 問題:
      icoding 和 VSCode 等項目目錄的計算方式:將項目的根目目錄(工作目錄)作為標准來計算各個模塊、文件的相對路徑,但是python包導入時候經常出現問題
      
    • 目錄結構
      * rootpath: 
          * x(文件夾)
                * __init__.py
                * x.py 
          * y(文件夾)
                * __init__.py
                * y.py
          * z.py(python文件)  
      
      x目錄, y目錄, z.py在同一級下; x目錄下有x.py模塊, y目錄下有y.py模塊
    • 導包
      • 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()
        

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
      
    • 模糊導入:
      from Root.Pack1 import *
      
      模糊導入中的*中的模塊是由__all__來定義的,init.py的另外一個作用就是定義package中的__all__,用來模糊導入,如__init__.py: (init.py中不必要吧?)
      __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簡單)
      

參考:

  1. vs code運行python導入上級目錄模塊問題
  2. Python包中__init__.py作用
    3.Python模塊包中__init__.py文件的作用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM