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

news/2024/11/22 17:10:27/

目录

一、说明

二、包-模块-函数结构

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.pymorestuff\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.pydef add(a, b):return a + bdef sub(a, b):return a - b

文件div_mul.py内:

# @file div_mul.pydef mul(a, b):return a * bdef 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)


http://www.ppmy.cn/news/58065.html

相关文章

【Python】序列类型①-列表

文章目录 1. 前言2. 列表的定义3. 列表的下标访问3.1 嵌套列表的下标 4. 列表的切片操作5. 列表的遍历5.1 使用for循环进行遍历5.2 while循环进行遍历 6.添加列表元素6.1 使用append方法添加元素6.2 使用insert方法添加元素 7. 列表的拼接7.1 使用 进行拼接7.2 使用extend 进行…

语义分割学习笔记(五)U-net网络

推荐课程:U-Net网络结构讲解(语义分割)_哔哩哔哩_bilibili 感谢博主霹雳吧啦Wz 提供视频讲解和源码支持,真乃神人也! 目录 1. U-net网络模型 2. 分割效果 3. U-Net源码解析(Pytorch版) 4. 测试结果 1. U-net网络模型 U-Net网络由两部分…

部署LVS-DR集群

引言 一、LVS-DR工作原理 LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。 LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用节点 Director Server 与 …

做程序员需要什么基础?自学编程难度有多大?初级程序员的工资?程序员要学

今天呢 我来彻底讲一下学编程做程序员 大家最关心的4个问题 文章比较长 耐心看完 如果你打算做程序员 这篇文章一定会建立你的信心 并且给你一个正确的学习方向 第一程序员的学历要求 如果你想去百度腾讯华为 字节这种一线大厂做程序员 那你至少要二本以上学历 最好呢还是计算机…

《算法训练营》语言基础(゚Д゚

👂 无论你多怪异我还是会喜欢你(《刺客伍六七》动画推广版片尾曲) - 周子琰 - 单曲 - 网易云音乐 一起补基础! φ(゜▽゜*)♪ 👂 My Nams Suzie - Susie/Farfashah …

http协议(一)/应用层

学习目标:⭐理解应用层的作用,理解协议,理解序列化和反序列化,并且实现网络版计算器⭐HTTP协议。⭐手写一个简单的http协议。 应用层 我们写的一个个解决实际问题, 满足我们日常需求的网络程序, 都是在应用层。 协议/序列化与反…

规模效应的几种形成机理

规模效应的几种形成机理 一切要素都具有稀缺性,生产原料、机械、人力,包括数据要素由于必须有物质载体所以也是具有稀缺性的。在要素具有稀缺性的前提下,竞争是处理稀缺性的唯一方式。然而竞争的强度却不是普遍统一的,这也导致利润…

【音视频处理】RTMP、HLS、HTTP-FLV、WebRTC、RTSP的区别?直播协议详解

大家好,欢迎来到停止重构的频道。 本期我们详细讨论直播的相关协议,包括:HTTP-FLV、HLS、RTMP、Web-RTC、RTSP等等。 我们将会详细介绍这些协议的工作原理、应用场景、及延迟的原因。 我们按这样的顺序讨论​ 1、 RTMP、HTTP-FLV 2、 …