详解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字符串编码识别模块chardet简单应用
Jun 15 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
python3使用GUI统计代码量
Sep 18 Python
基于python plotly交互式图表大全
Dec 07 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
Python logging模块原理解析及应用
Aug 13 Python
详解python tkinter 图片插入问题
Sep 03 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
php去除头尾空格的2种方法
2015/03/16 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
python 画条形图(柱状图)实例
2020/04/24 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
优秀教师先进事迹
2014/01/22 职场文书
社区母亲节活动方案
2014/03/05 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2014年资料员工作总结
2014/11/18 职场文书
升职自我推荐信范文
2015/03/25 职场文书
2015年大学生实习评语
2015/03/25 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
个人收入证明格式
2015/06/24 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript