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简单)
- 精确导入: