详解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 CGI脚本的教程
Jun 29 Python
一文总结学习Python的14张思维导图
Oct 17 Python
python用户评论标签匹配的解决方法
May 31 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
python实现的Iou与Giou代码
Jan 18 Python
Python中断多重循环的几种方式详解
Feb 10 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
Pycharm及python安装详细教程(图解)
Jul 31 Python
详解python tkinter 图片插入问题
Sep 03 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之OpCode原理详解
2016/06/01 PHP
Nginx实现反向代理
2017/09/20 Servers
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
Python多进程原理与用法分析
2018/08/21 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
四年的大学生生活自我评价
2013/12/09 职场文书
道德模范事迹材料
2014/12/20 职场文书
个人业务学习心得体会
2016/01/25 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书