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文件的作用
原文地址:https://www.cnblogs.com/zhangtao-0001/p/14860579.html