一.简单说明

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

>>> yuhaohao.sulli1

Traceback (most recent call last):

File "", line 1, in

AttributeError: module 'yuhaohao' has no attribute 'sulli1'

>>> yuhaohao.sulli2

Traceback (most recent call last):

File "", line 1, in

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 "", line 1, in

AttributeError: module 'sound' has no attribute 'effects'

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

>>> import sound.effects

effects package is getting imported!

>>> sound.effects

如果你希望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_python之package定义相关推荐

  1. python package_Python之package、module

    一.模块: 1.简单的描述:一个.py文件 2.好处:大大提高代码的可维护性 3.模块三种:1.python标准库 2.第三方模块 3.应用程序自定义模块(*****) 4.import实质就是:1. ...

  2. Python的包(package)和模块(module)的区别,如何导入python包和模块,以及为什么可以把包名当作一个模块导入

    本文主要讨论标题中的三大问题,接下来逐一分析: 文章大部分内容转载并重新整理自https://zhuanlan.zhihu.com/p/33913131 1. Python的包(package)和模块 ...

  3. 针对不同的package定义log输出

    2019独角兽企业重金招聘Python工程师标准>>> 针对不同的package定义log输出 转载于:https://my.oschina.net/u/138995/blog/19 ...

  4. python中可变参数*args传入函数时的存储方式为_python 中文读法详解Python函数可变参数定义及其参数传递方式...

    Python函数可变参数定义及其参数传递方式详解 python中 函数不定参数的定义形式如下 1. func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): ...

  5. python二叉树遍历算法_分享python实现的二叉树定义与遍历

    这篇文章主要介绍了python实现的二叉树定义与遍历算法,结合具体实例形式分析了基于Python定义的二叉树及其常用遍历操作实现技巧,需要的朋友可以参考下 本文实例讲述了python实现的二叉树定义与 ...

  6. python turtle画气球-如何用python的装饰器定义一个像C++一样的强

    如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...

  7. python使用del保留字定义一个函数-Python使用什么保留字定义一个函数。

    [单选题]Where was the First Continental Congress held? [单选题]对于集合S和T,下列不属于集合类型的操作是() [判断题]UPS系统的静态开关用于保护 ...

  8. python使用del保留字定义一个函数-函数和代码复用 --Python

    1.关于递归函数的描述,以下选项中正确的是 A.包含一个循环结构 B.函数比较复杂 C.函数内部包含对本函数的再次调用 D.函数名称作为返回值 答案:D 答案解析:递归函数是指函数内部包含对本函数的再 ...

  9. python定义方法self会被当作变量_为什么Python必须在方法定义和调用中显式使用“self”?...

    为什么Python必须在方法定义和调用中显示使用"self"? 这个想法借鉴了 Modula-3 语言.出于多种原因它被证明是非常有用的. 首先,更明显的显示出,使用的是方法或实例 ...

最新文章

  1. Spring-基于Java类的配置
  2. 设计模式之_Strategy_03
  3. 定了!2020年,6种将死的编程语言!
  4. mysql 主从备份 主服务器配置_同一服务器配置Mysql主从备份
  5. echarts曲线太多卡顿怎么优化_光刻胶旋涂曲线如何获得?
  6. 【编程语言之Python】之plt画图尺寸、去白边
  7. Java多线程之同步与阻塞队列
  8. 记录一次VM14虚拟机出问题 Oh no,something has gone wrong!
  9. 探索性测试的分类与测试用例
  10. 制作一个启动软盘并用bochs模拟器启动
  11. 雷曼 疯狂兔子 java_《雷曼:疯狂兔子》详细流程攻略+个人心得分享
  12. Python 小程序:计算24点
  13. 【知识图谱】知识图谱数据构建的“硬骨头”,阿里工程师如何拿下?深度学习在知识图谱构建中的应用。
  14. java中的数据解析是_Java从网络中请求获取JSon数据以及解析JSON数据----(自创,请注明)...
  15. [XSY 3322][置换+dp]Dexterity
  16. CRM销售系统价格 一套CRM销售系统多少钱
  17. VS2013打开ASP.NET网站管理工具
  18. 核苷酸类化合物库 脂类化合物库参与细胞调控
  19. DIY一个专属个人网盘
  20. 整理服务器项目描述,项目详细实施方案-模板整理版.doc

热门文章

  1. 产品经理必须知道的一些知识:决定价格的四种因素
  2. java中native_java中的native关键字
  3. swal ajax,Sweetalert详细介绍
  4. 鼠标拖动改变DIV等网页元素的大小的最佳实践
  5. Scroll Depth – 衡量页面滚动的 Google 分析插件
  6. scroll-view组件bindscroll实例应用:自定义滚动条
  7. canvas入门实战--邀请卡生成与下载
  8. git提交代码到码云
  9. babel6和babel7中关于polyfill和preset-env和babel-plugin-transform-runtime等总结
  10. 浏览器记住密码的自动填充Input问题完美解决方案