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如何解析配置文件并应用到项目中
Jun 27 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
通过实例解析Python调用json模块
Dec 11 Python
Python 统计位数为偶数的数字代码详解
Mar 15 Python
Django数据库操作之save与update的使用
Apr 01 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
如何在pycharm中安装第三方包
Oct 27 Python
python 实现全球IP归属地查询工具
Dec 18 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 Python
python excel和yaml文件的读取封装
Jan 12 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
Zend 输出产生XML解析错误
2009/03/03 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
php获取错误信息的方法
2015/07/17 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
PHP实现的日历功能示例
2018/09/01 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
使用Python实现简单的服务器功能
2017/08/25 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
优秀食品类广告词
2014/03/19 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
2015年体育部工作总结
2015/04/02 职场文书
物业保安辞职信
2015/05/12 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
Go并发4种方法简明讲解
2022/04/06 Golang
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers