一.简单说明

python是通过module组织代码的,每一个module就是一个python文件,但是modules是通过package来组织的。我们平时在简单测试的时候

一般就是几个Python文件存放在同级的目录下,但是当我们开始尝试开发更为复杂的项目时,package这个概念的使用就有助于我们写的一个

个modules。

二.python package

package的定义很简单,在当前目录下有__init__.py文件的目录即为一个package。

这里也会分为两种情况,一种是空的__init__.py文件,另外一种是包含代码的__init__.py文件。

无论空与非空,这个目录都会被认为是一个package。

三.package的初始化

一个package被导入,无论什么时候,init.py的代码都只会执行一次。

注意:由于package被导入时,init.py中的可执行代码会被执行,所以小心在package中放置你的代码,比如把代码尽可能封装成函数或类。

3.1 init.py内部的导入顺序

当尝试导入某个包时,如下:

from package import something

import语句会首先检查something是不是__init__.py的变量。然后检查是不是subpackage,再检查是不是module,最后抛出ImportError。

顺序如下:

1.init.py文件内变量

2.是不是package内的subpackage

3.是不是package内module

举例说明:

这里我们创建一个yuhaohao的package,目录下有sulli1.py sulli2.py init.py文件

文件内容内下:

sulli1.py

#!/usr/bin/python3
def tl():
print("Hello, function 'tl' from module 'sulli1' calling")

sulli2.py

#!/usr/bin/python3
def ol():
print("Hello, function 'ol' from module 'sulli2' calling")

init.py文件内容为空。

[root@centos8 pipeline]# python3
Python 3.6.8 (default, May 21 2019, 23:51:36)
[GCC 8.2.1 20180905 (Red Hat 8.2.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yuhaohao
>>> yuhaohao
<module 'yuhaohao' from '/root/pipeline/yuhaohao/__init__.py'>
>>> yuhaohao.sulli1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'yuhaohao' has no attribute 'sulli1'
>>> yuhaohao.sulli2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'yuhaohao' has no attribute 'sulli2'

可以看出yuhaohao的路径被包含在python的sys.path的环境变量中。但是sulli1.py和sulli2.py并没有被导入。

如果想要在import yuhaohao后自动加载sulli1和sulli2模块,这里可以在__init__.py文件中增加如下内容:

import sulli1
import sulli2

第二种方案就是手动导入,当想使用模块sulli1中的tl()函数时,需要手动导入

>>> import yuhaohao.sulli1 as yu
>>> yu.tl()

下面是一个更复杂的例子,下载的URL为:https://www.python-course.eu/sound1.tar.bz2

解压后,文件结构如下:

sound
|-- effects
| |-- echo.py
| |-- __init__.py
| |-- reverse.py
| `-- surround.py
|-- filters
| |-- equalizer.py
| |-- __init__.py
| |-- karaoke.py
| `-- vocoder.py
|-- formats
| |-- aiffread.py
| |-- aiffwrite.py
| |-- auread.py
| |-- auwrite.py
| |-- __init__.py
| |-- wavread.py
| `-- wavwrite.py
`-- __init__.py

这里直接使用import sound来导入这个package时,我们可以导入package sound,但是sound的子package(effects,filters,formats)并不会被自动

导入,子package不会被自动导入的原因是因为在sound目录下的__init__.py文件并没有任何关于导入子package的代码。

导入sound:

>>> import sound
sound package is getting imported!
>>> sound.effects
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'sound' has no attribute 'effects'

如果你想使用子package的内容,但是在父package的__init__.py的文件内并没有导入,你需要手动导入

>>> import sound.effects
effects package is getting imported!
>>> sound.effects
<module 'sound.effects' from '/root/pipeline/sound/effects/__init__.py'>

如果你希望python帮你自动导入sound.effects你可以往sound目录下的__init__.py文件写入

"""An empty sound package

This is the sound package, providing hardly anything!"""

import sound.effects
print("sound package is getting imported!")

当然了,除了使用绝对路径你可以使用相对路径来导入sound.effects

"""An empty sound package

This is the sound package, providing hardly anything!"""

from . import effects
print("sound package is getting imported!")

这跟linux的命令行比较像,.代表当前目录,..代表上级目录。所以你可以在sound.effects的__init__.py文件内写入

from .. import formats

参考链接:https://www.jianshu.com/p/178c26789011

python之package定义的更多相关文章

  1. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  2. python类的定义和使用

    python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...

  3. [Centos] mod_wsgi 安装流程以及遇到问题解决办法。apxs: command not found 或 Sorry, Python developer package does not appear to be installed.

    前提: Centos 系统, apache 已安装, python 已安装. 1. 首先下载mod_wsgi-3.5.tar.gz 下载地址:https://code.google.com/p/mod ...

  4. Python类的定义

    Python笔记--类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  5. Python函数的定义、参数传入与函数的调用

    作为计算机代码的一种抽象方式,函数在Python中扮演了极为重要的角色.今天给大家介绍Python函数的定义.参数的传入以及调用方式.其中函数参数的传入方式为本节重点内容.Python函数的参数形式包 ...

  6. Python 函数之定义函数

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号: 然后,在缩进块中编写函数体,函数的返回值用return语句返回. 1.定义一个函数 def myfirst( ...

  7. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  8. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

  9. 第7.15节 Python中classmethod定义的类方法详解

    第7.15节  Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一.    类方法的定义 在类中定 ...

  10. python之模块定义、导入、优化详解

    一.模块 1.模块的定义 模块是一组包含了一组功能的python文件,比如test.py,模块名为test,可以通过import test进行调用.模块可以分为以下四个通用类别 1 使用python编 ...

随机推荐

  1. linux ln命令详解

    介绍 ln是linux的一个重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  2. 手把手教你如何给 Docker 开启 IPv6 网络支持

    Docker 默认是不开启 IPv6 支持的,但是我们某些业务往往又需要 IPv6 的支持,特别是 IPv6 普及大势所趋,本文主要介绍的是如何开启 Docker 桥接网络 IPv6 支持,这篇文章具 ...

  3. BUUCTF---RSA1

    RSA基础概念 rsa原理: RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥 RSA算法的具体描述如下: (1) ...

  4. 【Docker】本地镜像发布到阿里云

    本地镜像发布到阿里云 本地镜像发布到阿里云流程 镜像的生成方法 1. 前面的DockerFile 2. 从容器创建一个新的镜像 docker commit [OPTIONS] 容器ID [REPOSI ...

  5. SpringAI用嵌入模型操作向量数据库!

    嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构 ...

  6. FastAPI中实现动态条件必填字段的实践

    title: FastAPI中实现动态条件必填字段的实践 date: 2025/04/03 00:06:20 updated: 2025/04/03 00:06:20 author: cmdragon ...

  7. 树形DP学习总结

    学完换根不久后发现不太熟了,赶紧写篇总结复习一下 \(\\\\\) 树形DP,即在树上进行DP的操作. 例题1:luogu P1352 没有上司的舞会 题目描述 某大学有 \(n\) 个职员,编号为 ...

  8. C# 线程(四)——异步

    参考: .NET进阶篇06-async异步.thread多线程3 - 知乎 (zhihu.com) C# Async/Await: 让你的程序变身时间管理大师_哔哩哔哩_bilibili C# 异步编 ...

  9. K8s新手系列之K8s中的资源

    K8s中资源的概念 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes. kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓 ...

  10. Ubuntu堡垒机搭建与设备管理指南

    以下是基于Ubuntu系统搭建堡垒机并集成设备管理的详细步骤和注意事项: 一.堡垒机搭建步骤 系统准备 sudo apt update && sudo apt upgrade -y s ...