详解Python中import机制


Posted in Python onSeptember 11, 2020

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中import机制的详细内容,更多关于Python import机制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
浅谈Python中带_的变量或函数命名
Dec 04 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
django解决订单并发问题【推荐】
Jul 31 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
基于python监控程序是否关闭
Jan 14 Python
Python无头爬虫下载文件的实现
Apr 02 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
python实现mean-shift聚类算法
Jun 10 Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
python使用隐式循环快速求和的实现示例
Sep 11 #Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 #Python
降低python版本的操作方法
Sep 11 #Python
Django crontab定时任务模块操作方法解析
Sep 10 #Python
Django日志及中间件模块应用案例
Sep 10 #Python
Django nginx配置实现过程详解
Sep 10 #Python
使用Python操作MySQL的小技巧
Sep 10 #Python
You might like
使用phpQuery采集网页的方法
2013/11/13 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
js常用DOM方法详解
2017/02/04 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
2018/02/06 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
python构造IP报文实例
2020/05/05 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
党校学习思想汇报
2014/01/06 职场文书
年度评优评先方案
2014/06/03 职场文书
个性车贴标语
2014/06/24 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
行政处罚告知书
2015/07/01 职场文书
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript