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浅拷贝、深拷贝及引用机制
Dec 15 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
python 列表降维的实例讲解
Jun 28 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
python 实现人和电脑猜拳的示例代码
Mar 02 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
python实现数字炸弹游戏程序
Jul 17 Python
python爬虫使用scrapy注意事项
Nov 23 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
一个程序下载的管理程序(一)
2006/10/09 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
php计算年龄精准到年月日
2015/11/17 PHP
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
python实现合并两个排序的链表
2019/03/03 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
个人简历的自荐信
2013/10/23 职场文书
村干部培训班主持词
2014/03/28 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
公司离职证明标准范本
2014/10/05 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技