Python 中 __init__.py 文件用法

这篇具有很好参考价值的文章主要介绍了Python 中 __init__.py 文件用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0、init.py

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

init.py可以是一个空文件,也可以有非常丰富的内容。本文将举一个非常简单的例子,来介绍__init__.py的用法;在本文的最后,我将会再简单介绍__init__.py的设计理念。

1、一个普通的四则运算模块

在不利用__init__.py的情况下,我们来看一个四则运算的例子。我们的工程目录结构如下图所示:
__init__.py,Python,python,开发语言,numpy
四则运算例子的工程目录结构
如上图,其中,main.py是程序入口,我们用了不同的方式来import四则运算的各个子模块。arithmetic模块实现四则运算;为了展示需要,我们将加减乘除四种运算分别放在不同的代码中。

每个文件的代码如下:

#
# @file main.py
#

import arithmetic.add
import arithmetic.sub as sub

from arithmetic.mul import mul
from arithmetic import dev

def letscook(x, y, oper):
    r = 0
    if oper == "+":
        r = arithmetic.add.add(x, y)
    elif oper == "-":
        r = sub.sub(x, y)
    elif oper == "*":
        r = mul(x, y)
    else:
        r = dev.dev(x, y)

    print("{} {} {} = {}".format(x, oper, y, r))

x, y = 3, 8

letscook(x, y, "+")
letscook(x, y, "-")
letscook(x, y, "*")
letscook(x, y, "/")
#
# @file add.py
#
def add(a, b):
    return a + b
#
# @file sub.py
#

def sub(a, b):
    return a - b
#
# @file mul.py
# 
def mul(a, b):
    return a * b
#
# @file dev.py
#
def dev(a, b):
    return a / b

从代码可以看出,为了使用arithmetic中的某个子模块(main.py中我们展示了四种不同的方式),我们必须使用非常繁琐的import语句;在使用的时候,也有可能需要使用非常繁琐的表达式。如果我们在不同的地方使用arithmetic的子模块,都需要写这么繁琐的import或者使用表达式,你可能会觉得心累。这就是为什么我们需要利用__init__.py来简化我们的使用。

2、利用__init__.py

还是第1小节中的工程目录结构,实现同样的功能,我们在__init__.py中编写了一些代码;同样,我们对main.py进行了一些适当的修改。

修改后__init__.py和main.py的代码如下:

#
# @file main.py
#

import arithmetic as a4

def letscook(x, y, oper):
    r = 0
    if oper == "+":
        r = a4.add(x, y)
    elif oper == "-":
        r = a4.sub(x, y)
    elif oper == "*":
        r = a4.mul(x, y)
    else:
        r = a4.dev(x, y)

    print("{} {} {} = {}".format(x, oper, y, r))

x, y = 3, 8

letscook(x, y, "+")
letscook(x, y, "-")
letscook(x, y, "*")
letscook(x, y, "/")
#
# @file __init__.py
#

import arithmetic.add
import arithmetic.sub
import arithmetic.mul
import arithmetic.dev

add = arithmetic.add.add
sub = arithmetic.sub.sub
mul = arithmetic.mul.mul
dev = arithmetic.dev.dev

在__init__.py中, 我们import了arithmetic下的所有子模块,并在__init__.py中给各个子模块的核心功能取了新的名字,作为arithmetic模块的变量。所以我们在main.py中import了arithmetic模块之后,就可以直接进行使用了。如果你使用from arithmetic import * 语句,那么我们就可以使用add、sub、mul、dev,连a4都省了。

3、init.py的设计原则

init.py的原始使命是声明一个模块,所以它可以是一个空文件。在__init__.py中声明的所有类型和变量,就是其代表的模块的类型和变量,第2小节就是利用这个原理,为四则运算的4个子模块声明了新的变量。我们在利用__init__.py时,应该遵循如下几个原则:

A、不要污染现有的命名空间。模块一个目的,是为了避免命名冲突,如果你在种用__init__.py时违背这个原则,是反其道而为之,就没有必要使用模块了。

B、利用__init__.py对外提供类型、变量和接口,对用户隐藏各个子模块的实现。一个模块的实现可能非常复杂,你需要用很多个文件,甚至很多子模块来实现,但用户可能只需要知道一个类型和接口。就像我们的arithmetic例子中,用户只需要知道四则运算有add、sub、mul、dev四个接口,却并不需要知道它们是怎么实现的,也不想去了解arithmetic中是如何组织各个子模块的。由于各个子模块的实现有可能非常复杂,而对外提供的类型和接口有可能非常的简单,我们就可以通过这个方式来对用户隐藏实现,同时提供非常方便的使用。

C、只在__init__.py中导入有必要的内容,不要做没必要的运算。像我们的例子,import arithmetic语句会执行__ini__.py中的所有代码。如果我们在__init__.py中做太多事情,每次import都会有额外的运算,会造成没有必要的开销。一句话,init.py只是为了达到B中所表述的目的,其它事情就不要做啦。文章来源地址https://www.toymoban.com/news/detail-532742.html

到了这里,关于Python 中 __init__.py 文件用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】Python 包 ② ( 自定义 Python 包 | 导入并调用自定义 Python 包 | `__init__.py` 定义 `__all__` 变量 )

    右键点击 PyCharm 中的 Python 工程根目录 , 选择 \\\" New / Python Package \\\" 选项 , 输入 Python 包名称 , 然后点击回车 , 创建 Python 包 ; 创建完成后 , 自动生成了一个 my_package 目录 , 该目录下自动生成了一个 __init__.py 文件 ; 在命令行中 , 使用 tree /f 命令 , 查看 该 Python 工程的目录结构 : 右

    2024年02月05日
    浏览(48)
  • (Python)对numpy中的argmax用法的理解

    argmax()返回的就是最大数的索引 argmax()有一个参数axis,可以指定函数返回不同维的最大值。 结果是 4 。而在python中一维向量只有一个方向,所以一维情况下axis只能等于0,函数只会返回一个值。 如果对它进行转置,它就会变成一个二维矩阵: axis的值大于0 比如说 会报错 nu

    2023年04月24日
    浏览(47)
  • 线性代数-Python-01:向量的基本运算 - 手写Vector及numpy的基本用法

    https://github.com/Chufeng-Jiang/Python-Linear-Algebra-for-Beginner/tree/main 单位向量叫做 u hat Vector.py _globals.py main_vector.py main_numpy_vector.py

    2024年02月08日
    浏览(42)
  • python头部信息、py头部信息、python头信息、py头信息、py文件头部

    Python py文件头部可指定以下信息: 1. 文件编码: # -*- coding: utf-8 -*- (指定文件的字符编码,通常为UTF-8。) 示例: # -*- coding: utf-8 -*- # -*- coding: utf-8 -*- 是在Python源代码文件的开头添加的注释,用于指定整个源代码文件的编码格式为UTF-8。这种注释通常被称为文件编码声明(

    2024年02月16日
    浏览(38)
  • python-基础篇-文件-py脚本

    报以上错误,需要在根目录下创建test文件夹

    2024年01月25日
    浏览(37)
  • 安装oneforall遇到的问题ImportError: cannot import name ‘sre_parse‘ from ‘re‘(C:\Python311\Lib\re\_init_.py)

    昨天试着安装一下信息收集特别好用的工具oneforall,没想到却遇到了一个特别大的问题 上网查找,却没想到竟然你没有一个答案,要么没有正确答案,要么众说纷纭,索性自己排查错误 根据报错提示,说的是不能从re中导入sre_parse,而且还和re文件夹下的_init_.py有关 下面是我

    2023年04月17日
    浏览(45)
  • python如何在一个py文件中调用另一个py文件中的方法

    要在一个Python文件中调用其他Python文件中的方法,可以使用Python的模块导入功能。模块是一个包含Python定义和语句的文件,可以被其他Python程序导入和使用。 假设我们有两个Python文件,一个是file1.py,另一个是file2.py。如果我们想在file1.py中调用file2.py中的方法,我们可以按照

    2024年02月11日
    浏览(37)
  • Python 打包配置文件 setup.py 详解

    在Python开发中,我们经常需要将自己的代码打包成可供其他人使用的库或应用程序。为了方便用户安装和使用,我们需要创建一个配置文件  setup.py ,用于定义打包的相关信息和依赖项。本文将详细介绍如何编写  setup.py  文件,并展示每一步需要做什么。 1.1 为什么需要对项

    2024年02月03日
    浏览(41)
  • Python - PyQT5 - ui文件转为py文件

    在QTdesigner图形化编辑工具中,有些控件我们是可以直接在编辑界面进行编辑的,有些是不可以编辑的,只能通过Python代码进行编辑,不过总体来说,所有能够通过图形化编辑界面可以编辑的,都可以通过Python语言实现控制,这点是毋庸置疑的,不过为了更加美观及降级软件开

    2024年02月05日
    浏览(53)
  • Python如何引用其他文件夹下的py文件

    Python引用其他模块的函数使用的语法是: from 模块名 import 函数名 如果将my_abs()函数定义保存为abstest.py文件,那么在该文件所在目录下,启动解释器,输入from abstest import my_abs,就可以执行my_abs函数。 那么,如何引用其他文件夹下的py文件 若要引用的包与文件不在同一个文件夹

    2024年02月16日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包