【python知识】__init__.py的来龙去脉

2023-05-16

目录

一、说明

二、包-模块-函数结构

2.1 包、模块、函数的关系

2.2 __init__.py的角色

2.3 识别包

三、__init__.py的功效

3.1 建立一个工程包

3.2 用__init__.py简化工程包

3.3 过滤

3.4 设置顶级全局变量

四、其它更多用法

4.1 高级应用

4.3 Python 3.3 及更高版本中可以不要__init__.py


一、说明

        我们常见__init__.py文件,但说不清楚它的用途,在本文,我将首先把它的来龙去脉说清楚,然后告诉大家,如何编制python工程,培养全局的编程格局。

二、包-模块-函数结构

        在Python工程里,当python检测到一个目录下存在__init__.py文件时,python就会把它当成一个包来对待。其内部文件就是模块(module)。Module跟C++的命名空间和Java的Package的概念很像,都是为了科学地组织工程。

        关于包

        Python 定义了两种类型的包,常规包和命名空间包。常规包是传统包,因为它们存在于 Python 3.2 及更早版本中。常规包通常实现为包含 __init__.py 文件的目录。导入常规包时,隐式执行此 __init__.py 文件,并将其定义的对象绑定到包命名空间中的名称。 __init__.py 文件可以包含任何其他模块可以包含的相同 Python 代码,并且 Python 会在模块导入时添加一些额外的属性。

2.1 包、模块、函数的关系

概念意义表现形式备注
工程,命名空间;目录工程内包含许多模块
模块工程的部分文件python文件模块定义若干函数(或类)
函数用户的调用单元def 函数代码

        包、模块、函数的关系如下:

         包内部有多个模块,模块内部有多个函数。

2.2 __init__.py的角色

        __init__.py可以是一个空文件,也可以有非常丰富的内容。本文将举一个非常简单的例子,来介绍__init__.py的用法;

  • 1)一个目录下如果有一个 __init__.py说明这个目录是个工程包。
  • 2)在其它软件调用该工程包,势必先执行__init__.py文件,这与class内部的__init__函数是一致的。
  • 3)外部用户程序调用包内函数时,需要import中将路径清楚地告诉系统。

2.3 识别包

        它有助于导入其他 python 文件。当您将此文件放在包含其他 py 文件的目录(比如 stuff)中时,您可以执行类似 import stuff.other 的操作。

root\
    stuff\
         other.py

    morestuff\
         another.py

        如果目录 stuff 中没有这个 __init__.py,您将无法导入 other.py,因为 Python 不知道 stuff 的源代码在哪里,也无法将其识别为包。

三、__init__.py的功效

3.1 建立一个工程包

  •         建立一个工程,起名为package。
  •         在package中建立两个文件,名称为add_sub.py, div_mul.py并编制代码如下:

文件add_sub.py内:

# @file add_sub.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

文件div_mul.py内:

# @file div_mul.py

def mul(a, b):
    return a * b

def dev(a, b):
    return a / b

制作一个调用函数文件:

main.py代码如下:

from package.add_sub import *
from package.div_mul import *
x = 101
y = 33
print( add(x,y))
print( sub(x,y))

print(dev(x,y))
print(mul(x,y))

>>>
134
68
3.0606060606060606
3333

        到此,工程包运行正常。

        但是有一个问题:

                from package.add_sub import *
                from package.div_mul import *

        这种调用模式是穷举的,如果有100个模块,那么,用户将写出100个import语句,如何简化之?

3.2 用__init__.py简化工程包

  • 在__init__.py编制代码:
from package.add_sub import *
from package.div_mul import *

 在main,py文件可以写成:

from package import *
x = 101
y = 33
print( add(x,y))
print( sub(x,y))

print(dev(x,y))
print(mul(x,y))

这好比将客户端写的:

from package.add_sub import *
from package.div_mul import *

转移到init,然后将init作为笼统名称交代给main函数。

3.3 过滤

        在init中可以过滤模块的函数,具体实现是在init中加入列表:

                __all__ = ['add',‘mul’] 

        这样,客户端只能使用'add',‘mul’函数,不可用其它函数了。

3.4 设置顶级全局变量

        在init中设置变量:

                FOO = "Hello world"

        于是在导入包后,任何地方都可以用FOO变量。

四、其它更多用法

4.1 高级应用

  • 您可以在导入时使用 __init__.py 配置包。例如,您可以设置变量或执行包正常工作所需的其他初始化任务。
  • 您可以使用 __init__.py 来定义当有人使用 from package import * 时应该导入哪些符号。这是通过设置 __all__ 变量来完成的,该变量是包含应导入的符号名称的字符串列表。
  • 您可以使用 __init__.py 在包中定义子模块或子包。这是通过在包中创建子目录并将 __init__.py 文件也放置在这些目录中来完成的。这允许您将包组织成逻辑单元,并使其更易于使用和维护。
  • 您可以使用 __init__.py 来定义包的 API,它是一组函数、类和其他供公众使用的符号。这可以帮助您的包的用户了解他们可以使用什么以及如何使用它们。
  • 您可以使用 __init__.py 为您的包定义自定义导入挂钩或其他自定义行为。这对于高级用例很有用,例如实现对替代模块语法的支持或自定义包的导入方式。

4.3 Python 3.3 及更高版本中可以不要__init__.py

        在 Python 3.3 及更高版本中,不再需要 __init__.py 文件来定义包。这是因为作为导入系统核心的 importlib 模块已更新为自动检测包而无需 __init__.py 文件。这意味着您只需创建一个目录并将模块文件放入其中即可创建包,而无需创建 __init__.py 文件。见文章:

The '__init__.py' File: What Is It? How to Use It? (Complete Guide)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python知识】__init__.py的来龙去脉 的相关文章

随机推荐

  • printf重定向的相关总结

    简介 实现printf重定向有多种方式 xff0c 下面一一介绍 linux环境下 虽然linux系统的默认标准输出设备是显示器 xff0c 但是我们可以把printf打印输出的内容重定向到其他设备或文件 方法如下 xff1a 方法1 xf
  • 开发者七问七答:什么是产品化?

    简介 xff1a 之前参加了企业智能部门如何做产品化的讨论 xff0c 大家对产品化的定义和过程都有各自不同的见解 我觉得这个话题其实可以扩展下 xff0c 想站在一个开发人员的视角尝试探讨一下产品化 下面以自问自答的方式来展开 1 当我们
  • 系统调用和库函数及API的区别

    在写程序的过程中 xff0c 像MFC xff0c VC 43 43 这些编程 xff0c 都会涉及到函数的调用 xff0c 有库函数也有系统函数 xff0c 下面看一看它们的区别 xff01 xff01 系统调用 xff08 system
  • 应用服务器与zk之间的连接超时

    关于connectString服务器地址配置 格式 192 168 1 1 2181 192 168 1 2 2181 192 168 1 3 2181 这个地址配置有多个ip port之间逗号分隔 底层操作 span class hljs
  • 日本小学生走向APP开发私塾 智能手机迫切改变IT教育——日本经济新闻报道

    如要在日本接受专门的信息技术教育 xff08 IT xff09 xff0c 只有结束义务教育课程才能接受 如今 xff0c 打破这些障碍的趋势逐渐浓厚 因为从小就接触到各种数字机器和互联网而长大的 数字土著 xff08 digital na
  • 步进电机和伺服电机的区别

    步进电机作为一种开环控制的系统 xff0c 和现代数字控制技术有着本质的联系 在目前国内的数字控制系统中 xff0c 步进电机的应用十分广泛 随着全数字式交流伺服系统的出现 xff0c 交流伺服电机也越来越多地应用于数字控制系统中 为了适应
  • 【图像处理】墨西哥小波和带通滤波

    一 说明 在连续小波的家族当中 xff0c 埃尔米特小波是个非常特别的存在 xff08 应用在连续小波转换称作埃尔米特转换 xff09 Ricker子波计算电动力学的广谱源项 它通常只在美国才会被称作墨西哥帽小波 xff0c 因为在作为核函
  • 【halcon知识】应用仿射变换

    一 说明 无论什么样的变换 xff0c 都离不开齐次变换矩阵 一般地 xff0c 先准备一个空的齐次变换矩阵 xff0c 这个矩阵随便填写 xff1a 1 xff09 填入旋转类参数就是旋转矩阵 xff0c 2 填入仿射参数就可进行仿射变换
  • 【ROS2知识】SQLite数据库

    目录 一 说明 二 介绍SQLite 三 安装 3 1 简单测试 生成一个表 3 2 sqlite 共五种数据类型
  • open3D

    目录 一 说明 二 如何安装open3d xff1f 三 显示点云数据 3 1 显示点云场景数据 3 2 体素下采样 3 3 顶点法线估计 一 说明 对于点云 处理 xff0c 这里介绍哦pen3d xff0c 该软件和opencv同样是i
  • 【计算几何7】帝国边界划分问题【Voronoi图的原理】

    目录 一 说明 二 帝国边界划分问题 三 voronoi的正规定义 3 1 最简单的voronoi情况 3 2 在距离空间的数学描述 3 3 不同距离空间所得 Voronoi 单元不同 四 代码和库 4 1 算法库 4 2 参数说明 4 3
  • 【python视图2】基于networkx的10个绘图技巧

    目录 一 说明 二 简单图操作种种 2 1 简单的无向图 2 2 简单的有向图 2 3 二维网格grid图 和边数据读写 2 4 环图 2 5 全连接神经网络 2 6 分布直方图 度秩图 连同子图 2 7 随机生成 2 8 渐变颜色化 2
  • ESP32控制TDC-GP22测量超声传播时间(超声流量计)

    TDC GP22控制的资料 xff0c 网上的资源都是基于STM32或者MSP430主控的 xff0c 但现在这两款芯片都太贵了 xff0c 因此就想用便宜点的ESP32 xff0c 折腾了快一周 xff0c 终于弄好了 工程源码和参考资料
  • 【python视图3】networkx图操作示例

    目录 一 说明 二 神奇制图 2 1 绘制彩虹图 2 2 随机地理图 2 3 旅行商问题 2 4 权重的灵活绘制 2 5 barabasi albert模型1 2 6 barabasi albert模型2 2 7 igraph操作 一 说明
  • 【python视图1】networkx操作Graph图

    目录 一 说明 二 生成图 xff08 Creating a graph xff09 2 1 创建一个没有节点和边的空图 2 2 在空图追加节点 2 3 追加边 xff08 Edges xff09 2 4 删除节点 2 5 查询 三 使用图
  • 【python】错误TypeError: ‘dict_values‘ object does not support indexing when的改出

    一 说明 在使用python的dict和索引时 xff0c 在早期的python可以 xff0c 但后来不可以了 因此 xff0c 在python执行语句 xff1a names i d values i for i in range le
  • 【Python知识】 可哈希和不可哈希对象

    目录 一 说明 二 可哈希 在Python中是什么意思 xff1f 2 1 什么是哈希 hashable xff1f 2 2 python的可哈希对象 2 3 实验和说明 2 4 什么是不可哈希 unhashable xff1f 三 更深的
  • 【python知识】推导式和生成器

    目录 一 说明 二 列表生成式 2 1 语法 2 2 列表推导式实例 三 字典的推导式 3 1 语法字典推导式 3 2 示例 四 集合推导式 4 1 集合推导的语法 4 2 实例 五 元组推导式 5 1 元组推导式基本格式 5 2 元组推导
  • 【python知识】运算符博览

    目录 目录 一 说明 二 基本数值运算符 2 1 基本运算符的列举 2 2 基本运算符的示例 2 3 复数基本运算符的示例 三 整数进制转化 3 1 进制转换运算符 3 2 实验代码和说明 四 整数按位运算 4 1 全部位运算符号 4 2
  • 【python知识】__init__.py的来龙去脉

    目录 一 说明 二 包 模块 函数结构 2 1 包 模块 函数的关系 2 2 init py的角色 2 3 识别包 三 init py的功效 3 1 建立一个工程包 3 2 用 init py简化工程包 3 3 过滤 3 4 设置顶级全局变