Python中import机制详解


Posted in Python onNovember 14, 2017

Python语言中import的使用很简单,直接使用 import module_name 语句导入即可。这里我主要写一下"import"的本质。

Python官方

定义:Python code in one module gains access to the code in another module by the process of importing it.

1.定义:

模块(module):用来从逻辑(实现一个功能)上组织Python代码(变量、函数、类),本质就是*.py文件。文件是物理上组织方式"module_name.py",模块是逻辑上组织方式"module_name"。

包(package):定义了一个由模块和子包组成的Python应用程序执行环境,本质就是一个有层次的文件目录结构(必须带有一个__init__.py文件)。

2.导入方法

# 导入一个模块
import model_name
# 导入多个模块
import module_name1,module_name2
# 导入模块中的指定的属性、方法(不加括号)、类
from moudule_name import moudule_element [as new_name]

方法使用别名时,使用"new_name()"调用函数,文件中可以再定义"module_element()"函数。

3.import本质(路径搜索和搜索路径)

moudel_name.py

# -*- coding:utf-8 -*-
print("This is module_name.py")

name = 'Hello'

def hello():
  print("Hello")
module_test01.py

# -*- coding:utf-8 -*-
import module_name

print("This is module_test01.py")
print(type(module_name))
print(module_name)

运行结果:

E:\PythonImport>python module_test01.py
This is module_name.py
This is module_test01.py
<class 'module'>
<module 'module_name' from 'E:\\PythonImport\\module_name.py'>

在导入模块的时候,模块所在文件夹会自动生成一个__pycache__\module_name.cpython-35.pyc文件。

"import module_name" 的本质是将"module_name.py"中的全部代码加载到内存并赋值给与模块同名的变量写在当前文件中,这个变量的类型是'module';<module 'module_name' from 'E:\\PythonImport\\module_name.py'>

module_test02.py

# -*- coding:utf-8 -*-
from module_name import name

print(name)

运行结果;
E:\PythonImport>python module_test02.py
This is module_name.py
Hello
"from module_name import name" 的本质是导入指定的变量或方法到当前文件中。

package_name / __init__.py

# -*- coding:utf-8 -*-

print("This is package_name.__init__.py")
module_test03.py

# -*- coding:utf-8 -*-
import package_name

print("This is module_test03.py")

运行结果:

E:\PythonImport>python module_test03.py
This is package_name.__init__.py
This is module_test03.py

"import package_name"导入包的本质就是执行该包下的__init__.py文件,在执行文件后,会在"package_name"目录下生成一个"__pycache__ / __init__.cpython-35.pyc" 文件。

package_name / hello.py

# -*- coding:utf-8 -*-

print("Hello World")
package_name / __init__.py

# -*- coding:utf-8 -*-
# __init__.py文件导入"package_name"中的"hello"模块
from . import hello
print("This is package_name.__init__.py")

运行结果:

E:\PythonImport>python module_test03.py
Hello World
This is package_name.__init__.py
This is module_test03.py

在模块导入的时候,默认现在当前目录下查找,然后再在系统中查找。系统查找的范围是:sys.path下的所有路径,按顺序查找。

4.导入优化

module_test04.py

# -*- coding:utf-8 -*-
import module_name

def a():
  module_name.hello()
  print("fun a")

def b():
  module_name.hello()
  print("fun b")

a()
b()

运行结果:

E:\PythonImport>python module_test04.py
This is module_name.py
Hello
fun a
Hello
fun b

多个函数需要重复调用同一个模块的同一个方法,每次调用需要重复查找模块。所以可以做以下优化:

module_test05.py

# -*- coding:utf-8 -*-
from module_name import hello

def a():
  hello()
  print("fun a")

def b():
  hello()
  print("fun b")

a()
b()

运行结果:

E:\PythonImport>python module_test04.py
This is module_name.py
Hello
fun a
Hello
fun b

可以使用"from module_name import hello"进行优化,减少了查找的过程。

5.模块的分类

内建模块

可以通过 "dir(__builtins__)" 查看Python中的内建函数

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__','__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round','set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

非内建函数需要使用"import"导入。Python中的模块文件在"安装路径\Python\Python35\Lib"目录下。

第三方模块

通过"pip install "命令安装的模块,以及自己在网站上下载的模块。一般第三方模块在"安装路径\Python\Python35\Lib\site-packages"目录下。

Python 相关文章推荐
零基础写python爬虫之urllib2使用指南
Nov 05 Python
Python入门教程之运算符与控制流
Aug 17 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
在cmd命令行里进入和退出Python程序的方法
May 12 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
python数据化运营的重要意义
Nov 25 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
Python3 webservice接口测试代码详解
Jun 23 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
python怎么删除缓存文件
Jul 19 Python
AI人工智能 Python实现人机对话
Nov 13 #Python
Python编程实现蚁群算法详解
Nov 13 #Python
Python编程实现粒子群算法(PSO)详解
Nov 13 #Python
人工智能最火编程语言 Python大战Java!
Nov 13 #Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 #Python
python、java等哪一门编程语言适合人工智能?
Nov 13 #Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 #Python
You might like
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
php URL跳转代码 减少外链
2011/06/25 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
14款NodeJS Web框架推荐
2014/07/11 NodeJs
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
JS常见算法详解
2017/02/28 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
python批量修改xml属性的实现方式
2020/03/05 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
大学运动会通讯稿
2014/01/28 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
说明书怎么写
2014/05/06 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
学生检讨书范文
2015/01/27 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers