Python包中__init__.py文件的作用和用法

2023-11-06

  在Python工程中,我们经常可以看到带有“__init__.py”文件的目录,在PyCharm中,带有这个文件的目录被认为是Python的包目录,与目录的图标有不一样的显示。如下图所示,「链接」dir_example是一个空白目录,图标是个文件夹图标,而init_example下有_init__.py文件,其图标是一个包。

  

Python包中__init__.py文件的作用和用法

  那么这个文件的作用是什么,我们平时如何使用呢,这篇文章将解释这个问题。

  

Python包中__init__.py文件的作用和用法

  一、__init__.py文件简介二、__init__.py文件的使用案例2.1、没有__init__.py文件的目录,使用import xx.xx会报错吗?2.2、在__init__.py文件中定义变量或者逻辑将在导入时候被执行2.3、在__init__.py文件中定义变量或者方法,可以被直接导入使用2.4、在__init__.py文件中使用__all__方法

  一、__init__.py文件简介

  Python 定义了两种类型的包,常规包和命名空间包。常规包是传统的包,因为它们存在于 Python 3.2 和更早的版本中。一个常规包通常被实现为一个包含__init__.py 文件的目录。当一个常规包被导入时,这个__init__.py文件被隐式执行,它所定义的对象被绑定到包的名字空间中。

  这是Python官方文档中对__init__.py文件的描述,其实它的意思很简单,就是说Python文件都是按照目录当作不同的模块来组织的,这个目录被认为是Python包目录,Python会通过搜索该目录下的文件来导入相关的模块。但是并不是所有的目录都会被搜索添加,只有当目录中包含__init__.py文件时,这个目录才会被Python当作是一个包目录,进而搜索添加里面的文件。这样做可以让编程者自己控制哪些目录可以被Python导入成包。

  当某个目录中包含__init__.py文件时,Python在引入这个模块之前,会首先执行这个文件。因此,这个文件也可以被编程者用来控制定义包级别的变量。

  综上所述,__init__.py文件最主要的作用是2个:

  当目录下包含这个文件时,Python会将其当作成包目录,进而可以使用import xx.xx的方式导入目录下的文件或者模块。使用__init__.py文件可以控制模块导入时的变量和内容,便于编程者的控制。

  下面我们看几个例子即可。

  二、__init__.py文件的使用案例2.1、没有__init__.py文件的目录,使用import xx.xx会报错吗?

  看版本,在较低的版本中(如3.2及以下),没有__init__.py文件的目录不能使用import xx.xx导入相关模块,但是后面的版本可以。

  2.2、在__init__.py文件中定义变量或者逻辑将在导入时候被执行

  例如,我们有如下的目录结构:

  init_example/

  a_pkg/

  __init__.py

  a.py

  init_test.py

  即init_example工程下有个init_test.py文件和a_pkg目录,a_pkg目录下有__init__.py文件和一个a.py文件。

  我们在a_pkg目录下的__init__.py文件定义:

  print("Hey, I am a __init__.py file")

  那么,如果我们在init_test.py中内容如下:

  from a_pkg import *

  执行init_test.py我们可以得到如下结果:

  Hey, I am a __init__.py file

  因为在from a_pkg import *时候,会首先执行a_pkg目录下的__init__.py文件。

  2.3、在__init__.py文件中定义变量或者方法,可以被直接导入使用

  还是上面的目录,假如我们在a_pkg目录下的a.py定义如下内容:

  def a_method():

  print("I am a_pkg!")

  在a_pkg目录下的__init__.py文件定义:

  from a_pkg.a import a_method

  那么,我们在init_test.py中引入a_pkg可以直接引入a_method方法:

  from init_example.a_pkg import a_method

  a_method()

  会打印如下内容:

  I am a_pkg!2.4、在__init__.py文件中使用__all__方法

  __all__方法可以在__init__.py文件定义一些包或者变量,可以在使用from init_example.a_pkg import *时定义*表达的内容。

  例如还是上面的内容,但是我们在a_pkg目录下的__init__.py文件定义:

  __all__=["a"]

  那么,我们在init_test.py中使用下面的语句可以引入a模块:

  from a_pkg import *

  a.a_method()

  这时候依然会打印如下内容:

  I am a_pkg!

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

Python包中__init__.py文件的作用和用法 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di

随机推荐

  • postman——基础操作——API授权

    当发送请求时 通常会包括参数 用以确保请求能够访问和范湖所需的数据 postman提供了授权类型 能在postman中处理身份验证问题 参考网址 https learning getpostman com docs postman send
  • 上传文件sftp和base 64上传的优缺点?

    上传文件时 SFTP和Base64编码都是常见的方式 它们具有各自的优缺点 SFTP SSH File Transfer Protocol 上传的优缺点 优点 安全性高 SFTP通过SSH协议进行传输 数据在传输过程中会进行加密 提供了较高
  • APP性能优化系列:内存优化-内存泄露详解

    转自http blog csdn net a910626 article details 50849760 一 内存泄露概念 在java中 如果一个对象没有可用价值了 但又被其他引用所指向 那么这个对象对于gc来说就不是一个垃圾 所以不会对
  • exec函数族

    前言 exec函数族提供了一个在进程中启动另一个程序执行的方法 它可以根据指定的文件名或目录名找到可执行文件 并用它来取代原调用进程的数据段 代码段和堆栈段 在执行完之后 原调用进程的内容除了进程号外 其他全部被新的进程替换了 另外 这里的
  • zabbix自动发现和自动注册

    1 配置zabbix自动发现 1 gt 自动发现主要是希望通过发现网络中的主机 并自动把主机添加到监控中 并关联特定的模板 实现自动监控 例如在办公网络中 希望通过ZabbixAgent监控所有工作电脑 只需要把新安装的电脑开放防火墙100
  • DNS服务器的搭建

    DNS 域名系统 它用于TCP IP网路 它提供的服务是用来将主机名和域名转换为IP地址的工作 DNS常用术语 1 DNS服务器 提供域名解析服务的主机 2 DNS客户机 任何联网的需要查询主机域名信息的主机 3 正向解析 将域名称解析为I
  • JAVA多线程服务器,UI实现

    JAVA多线程服务器 UI实现 服务器选择端口启动服务 客户端填入服务器名和端口进行服务器连接 实现功能 多客户端的同时连接 客户端上线通知 点击send按钮或者敲击回车进行发送 消息发送时间显示 客户端与服务器实时通信 可同时发送多条消息
  • 运算放大器设计及应用参讨(三)

    1 请问运放上的 15V 电压不稳定是不是也影响输出波形 问 请问运放上的 15V 电压不稳定是不是也影响输出波形 答 1 电源电压的波动会影响到输出的 但是对于输出能影响到多少 运放中有个参数PSRR 可以体现出来 例如PSRR 80dB
  • 华硕z97不识别m2固态_固态盘M.2、SATA有这样的差别,难怪大家都选“它”

    M 2接口SSD 现在常见的固态硬盘都是M 2或者SATA3接口 那么他们之间的区别是什么呢 今天 小编就以问答的形式 给大家普及下M 2固态硬盘的相关知识 1 什么是M 2接口 M 2是硬盘的一种接口 主要优势就是比传统的SATA3 0接
  • 对随机变量的简单理解

    首先看下官方定义 随机变量是从样本空间投影到实数轴的一个广义的实值函数 对任意一个样本点w 存在唯一的实数X w 与之对应 我画了下图来解释这个定义 当我们需要研究事件发生的概率时 引入随机变量后 对事件概率的研究不再是重点 而是转化为对随
  • 变量名中的反义词

    add remove begin end create destroy insert delete first last get release increment decrement put get up down lock unlock
  • MySql.Data连接数据库mysql

    using MySql Data MySqlClient using MySql Data using System Data using System IO MySqlConnection con new MySqlConnection
  • SVN版本库的分支和Tag

    SVN的branch和tag管理都是通过copy实现的 它并没有独立的branche和tag概念 它仅仅是管理文件的历史 trunk branch tag对于SVN而言都是普通的文件夹 创建分支的svn命令 svn copy http sv
  • python中的linearregression_Python 线性回归(Linear Regression) - 到底什么是 regression?...

    背景 这个 linear Regression 中的 Regression 是什么意思 字面上 Regression 是衰退的意思 线性衰退 相信理解了这个词 对线性回归可能印象深刻些 Regression 到底是什么意思 搜了一番 原来是
  • mongodb的时间差 8小时

    存储在mongodb中的时间是标准时间UTC 0 00 而中国的时区是 8 00 所以实际的显示时间是加了八小时的 取出时间时 需要减去八小时
  • Android 内存泄露分析

    1 内存泄漏简介 内存泄漏是指内存空间使用完毕后无法被释放的现象 尽管Java有垃圾回收机制 GC 但是对于还保持着引用 逻辑上却已经不会再用到的对象 垃圾回收器不会回收它们 内存泄漏带来的危害 用户对单次的内存泄漏并没有什么感知 但当可用
  • 智能优化算法-战争策略算法War Strategy Optimization Algorithm(附Matlab代码)

    引言 战争策略算法War Strategy Optimization Algorithm是基于军队在战争中的战略运动 将战争策略建模为一个优化过程 每个士兵都动态地向最优值移动 该算法对两种流行的战争策略 进攻和防御策略进行建模 士兵在战场
  • VBA技术资料MF54:VBA_EXCEL实时获取鼠标位置

    分享成果 随喜正能量 若人散乱心 乃至以一花 供养于画像 渐见无数佛 所以发一幅释迦牟尼佛像 与同修善友一起每日在微博上供养 只要有供养之心 便可积累功德 以此回向 愿求者如愿苦者得乐 愿这世界吉祥安乐 愿每颗心充满善念 我给VBA的定义
  • 0.96寸OLED12864显示屏设计方案(原理图+PCB+BOM表+程序)

    一 简介 OLED 屏幕作为一种新型的显示技术 其自身可以发光 亮度 对比度高 功耗低 在当下备受追捧 而在我们正常的显示调整参数过程中 我们越来越多的使用这种屏幕 我们使用的一般是分辨率为 128 64 屏幕尺寸为 0 96 寸 由于其较
  • Python包中__init__.py文件的作用和用法

    在Python工程中 我们经常可以看到带有 init py 文件的目录 在PyCharm中 带有这个文件的目录被认为是Python的包目录 与目录的图标有不一样的显示 如下图所示 链接 dir example是一个空白目录 图标是个文件夹图