首页 > 编程语言 >python中_init_.py 到底有啥用?

python中_init_.py 到底有啥用?

时间:2024-10-12 15:12:09浏览次数:6  
标签:__ __. python py module1 _. init 导入

 

1. __init__.py 是个啥?

__init__.py,这个文件名就是用来“初始化”的。在Python里,它主要用于标识一个目录是一个“包(Package)”。在项目里新建了一个文件夹,要让它成为一个可供导入的模块包,最简单的办法就是在里面加一个__init__.py。

比如,咱们有个项目结构如下:

my_project/    
├── __init__.py    
├── module1.py    
└── module2.py

想要在外部使用 my_projec t这个包时,就可以这样导入:

import my_project

有了__init__.py的存在,Python才知道my_project是一个包,而不是一个普通的文件夹。所以这个文件的基本作用就是:告诉Python,“这里是个包,可以在其他地方导入我!”

2. __init__.py 还能做些啥?

1. 模块初始化操作

假如有一个需要初始化配置的工具包,可以在__init__.py里直接搞定这些初始化工作。

# 例子:my_project/__init__.py

import os

# 初始化配置文件路径
config_file = os.path.join(os.path.dirname(__file__), 'config.yaml')
print("正在初始化配置文件……")

当一导入my_project时,config.yaml就被自动加载了。再也不用在每个子模块里重复配置路径!

2.控制子模块导入

通过在__init__.py中导入函数,可以直接在 import package_name 的时候就将所有常用的子模块或者函数导入,这样就能从包的顶级目录直接访问子模块的内容了:

 

3.包级别变量和函数的初始化

还可以在__init__.py里设置一些全局变量,或者定义一些包级别的工具函数。

 

3. __init__.py 的一些“坑”【循环导入】

什么是循环导入?

假设有两个模块module1和module2,然后在module1.py中写了这样一段代码:

# module1.py

from .module2 import some_function

  

然后又在module2.py里这样写

# module2.py

from .module1 import another_function

这就会导致Python在导入包的时候出现死循环,结果是两边互相等待对方加载,最终就会报错或者无法正常导入。 

 

4. __init__.py 和相对导入的关系

相对导入和绝对导入

__init__.py里用相对导入的语法,比如:

from .module1 import func1

看上去没问题,但等到跑module1.py这个文件时,就会发现报错了!因为相对导入的方式要求你必须从顶层包开始导入。而你直接执行module1.py,Python根本不知道它是从哪个包里来的。

建议尽量使用绝对导入,比如这样:

from my_project.module1 import func1

这样不管是直接运行module1.py,还是导入整个my_project,都不会有问题。

 

5. 还有哪些小技巧?

避免复杂逻辑:不要在__init__.py中写太复杂的业务逻辑。应该是轻量级的初始化和导入,不然以后维护起来会非常麻烦。

模块导出控制:你可以用__all__来控制从包中导出哪些模块或变量。

这样当你用 from my_project import *时,Python只会导入__all__指定的内容

__all__ = ['module1', 'module2']

 

标签:__,__.,python,py,module1,_.,init,导入
From: https://www.cnblogs.com/pywen/p/18460586

相关文章

  • java.lang.UnsupportedOperationException: null
    问题描述:在Java中,当你遇到 java.lang.UnsupportedOperationException 这个异常时,通常意味着你尝试在一个不支持该操作的集合上执行了一个操作。在这个具体的例子中,问题很可能出在 toList() 方法的使用上,以及后续对列表的修改。List<Long>ids=dtos.stream(......
  • LevOJ.sln - Beyond course 1
    LevOJ.sln-problemsB1682[Usaco2005Mar]OutofHay干草危机问题描述解决方法P1033简单排序问题描述解决方法法一冒泡排序#include<stdio.h>voidbubble_sort(intn,intarr[]){for(inti=0;i<n;i++){for(intj=0;j<n-i......
  • Python中语法糖
    什么是语法糖?语法糖指简化语法,代码的基本逻辑没改变。语法糖代码示例squares_dict={}forxinrange(10):squares_dict[x]=x**2 列表推导简单的方式生成列表语法糖:squares_dict={x:x**2forxinrange(10)}输出:[0,1,4,9,......
  • 2024.10.12 1438版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • TypeError: add_triangle_mesh(): incompatible function arguments. The following a
    12024.10.1214:52Traceback(mostrecentcalllast):File"terrain_creation.py",line119,in<module>gym.add_triangle_mesh(sim,vertices.flatten(),triangles.flatten(),tm_params)TypeError:add_triangle_mesh():incompatiblefunct......
  • 核密度估计 python代码
    确实,我提供的示例代码中有一些需要修正的地方。让我们逐一解决这些问题,并提供正确的核密度估计(KDE)的Python代码。使用SciPy进行核密度估计importnumpyasnpfromscipy.statsimportgaussian_kdeimportmatplotlib.pyplotasplt#生成一些随机数据data=np.random.no......
  • Qwen2.5-Coder——专门从事代码生成、完成和数学推理任务的 LLM
    1.概述论文地址:https://arxiv.org/pdf/2409.12186源码地址:https://github.com/qwenlm/qwen2.5-coderQwen2.5-Coder是其前身CodeQwen1.5的重大演进,专门设计用于执行代码生成和代码修改等编程相关任务。该系列包括两个型号,参数分别为15亿(15亿)和70亿(70亿)。2.算法......
  • Index-1.9B: 哔哩哔哩自主研发的轻量级多语言大模型
    Index-1.9B模型简介Index-1.9B是哔哩哔哩自主研发的一款轻量级多语言大模型系列,包含以下几个版本:Index-1.9Bbase:基础模型,具有19亿非嵌入参数,在2.8T主要为中英文的语料上进行预训练,在多项评测基准上领先同级别模型。Index-1.9Bpure:基础模型的对照版本,参数和训练策略......
  • js.旋转图像
     链接:48.旋转图像-力扣(LeetCode)题目:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转90度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6......
  • 代码随想录训练营第五天|Leetcode.349,Leetcode.454,Leetcode19,Leetcode18
    一、哈希表和set和map和数组的关系 用哈希表,判断是否出现过。数值很大或者数值很分散时,不用数组,占用空间大,用set。set,multiset数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判......