Python笔记--import

首先要理解python里模块和包的概念:
* 模块(module):扩展名为.py的文件
* 包(package):含有模块的文件夹,在python2里,包含__init__.py的文件夹。

当模块(module)中的代码需要访问另一个模块(module)或包(package)的时候,需要导入(import)模块(module)或包(package)

Python的导入流程:

以导入模块abc为例:
首先Python会在sys.modules中找该模块名,sys.modules是之前导入的所有模块的缓存
如果在缓存中没有找到,Python会在内置模块中查找,这些模块都可以在Python Standard Library中找到。
如果依然没有找到,Python会在sys.path中查找,即在系统的环境变量中查找,通常会包含当前文件夹,并且当前文件夹会第一个被查找。
当python找到模块时,它将其绑定到本地作用域中。这样abc就会被定义并且被当前文件使用而不会报错。

Import的两种形式:

直接导入资源:

import abc

其中,abc可以是一个包或者是一个模块

从另一个模块或包中导入资源:

from xyz import abc

其中,xyz可以是模块、子包、对象(类、函数)
如果将abc换成*,即意为导入xyz下的所有资源,这种调用通常很少用
在xyz下的__init__.py中,使用__all__ 可以定义*导入的资源(可以自己尝试一下)

在导入过程中,可以对导入的资源重新命名。
如:

import abc as rename

此时,必须使用rename进行引用,使用abc会无法识别

导入的样式(布局)

一般情况下,导入的资源分为三类:
标准库导入,Python的内置模块
关联的第三方导入,模块不属于当前应用项目但是已经被装载
本地应用导入,模块属于当前应用项目
所以在书写时,可以根据这三类,进行分类,同时根据字母进行排序,增加可读性

Import还有两个比较有用的小知识点

  1. 如果package文件夹下包含__init__.py模块,导入package时会先执行__init__.py代码
  2. 所有模块只会被导入一次

绝对导入和相对导入

绝对导入(Absolute Imports)

指定从项目根文件夹中使用其完整路径导入的资源。
比如一个项目的目录结构如下:
└── project
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── init.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
project包含两个子包:package1和package2,
package1里包含了两个模块:module1.py和module2.py
package2里包含了三个模块和一个子包:init.py、module3.py、module4.py和subpackage1
subpackage1里包含了一个模块:module5.py
现在假设:

  1. package1/module2.py包含一个函数function1.
  2. package2/init.py包含一个类class1.
  3. package2/subpackage1/module5.py包含一个函数function2.
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

绝对导入需要给出从顶级包开始的完整路径
绝对导入的利弊:
清晰且直接,可以很容易看出导入的资源所在位置
但是当目录结构过于复杂时,会显得特别的冗长

相对导入(Relative Imports)

指定要相对于当前位置(即import语句所在的位置)导入的资源。相对导入有两种类型:隐式和显式。在python 3中,隐式相对导入已被弃用,就不聊隐式了。
相对导入的形式:

from .some_module import some_class
from ..some_package import some_function
from . import some_class

相对导入使用点标记来指定位置。
单点 . 意味着引用的模块或包位于与当前位置相同的目录中。
两点 … 表示它在当前位置的父目录中,即上面的目录中。
三个点 … 表示它在祖父母目录中,以此类推。

# package1/module1.py
from .module2 import function1
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2

相对导入可能会很混乱,特别是对于目录结构可能更改的共享项目。相对导入也不像绝对的一样具有很好的可读性,而且很难分辨导入资源的位置。

测试程序

为了便于理解,我写了测试程序放在了Github上。推荐使用debug模式运行代码,这样可以看清楚程序具体执行过程。项目目录和上边的例子不同
下载地址:https://github.com/TianHY1988/ImportTestInPython.git.
如果有任何疑问、建议或者有相关问题的讨论,欢迎留言或者直接给我email:tianhy1988@gmail.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值