zoukankan      html  css  js  c++  java
  • 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文件的作用
  • 相关阅读:
    HTTP学习笔记(1)ULR语法
    wsdl地址如何在远程服务器上查看源码?
    java线程详解(三)
    java线程详解(二)
    java线程详解(一)
    java中this用法总结
    Linux运行python程序
    如何获取到Java对象的地址
    IDEA 远程调试
    linux环境中mysql默认端口3306无法连接问题排查
  • 原文地址:https://www.cnblogs.com/zhangtao-0001/p/14860579.html
Copyright © 2011-2022 走看看