Python3中from...import...与import...的区别详解
本文详细解析Python3中import与from...import两种导入方式的区别。通过tkinter模块示例,阐述import执行__init__.py文件及模块解释执行的本质,对比from...import直接提取模块内容的机制。分析两者在引用路径查找上的性能差异,并提供优化建议,帮助开发者理解导入原理并提升代码效率。
前言
以下说明以tkinter模块为例进行解析。
下图展示了安装后在Python解释器路径下lib(库)文件夹中tkinter文件夹内的具体内容。

1. import ...
语法示例:import tkinter
说明如下:
使用import引入的是包根目录下__init__.py文件的全部内容,包括其中定义的类、类的公有属性、类的公有方法以及其他代码。这种导入方式的本质是执行__init__.py文件。
对于模块而言,这种导入方式的本质是将模块文件解释执行一遍,并将结果赋值给模块名(即module_name = "module_name.py all code")。
执行流程为:import module_name 指向 module_name.py 文件,进而定位到 module_name.py 所在路径,最终在 sys.path(本质上是一个列表)中进行查找。
2. from ... import ...
语法示例:from ... import ...
说明如下:
from ... import ... 引入的是包根目录下的__init__.py以及指定文件的内容。需要注意的是,直接导入包通常没有实际意义,最终目的是导入包内的具体模块。这种导入包的方式较为少见。
当导入模块时,其本质是将module_name.py文件拆解,将其中需要的部分提取出来在当前文件中执行一遍。
3. 引用行为的差异
下方代码块展示的差异,主要受上述说明中所述机制的影响。
# test.py
# coding: utf-8
# author: admain_maxin
class Test(object):
def add(self, num=1):
print(num+1)# test1.py
# coding: utf-8
# author: admain_maxin
import test
test.Test().add()
from test import Test
Test().add()4. 引用优化
例如,当我们需要引用某个模块module_name.py中的test()函数时,如果采用import test方式,系统首先需要在sys.path列表所列出的目录下查找模块module_name.py。若多个函数均执行此操作,会耗费大量时间(问题在于重复查找module_name.py模块)。此时可直接将模块中的函数导入,以优化性能。
from module_name import test
# def test():
# print("this is module_name.py test")
def test1():
test()
def test2():
test()
def test3():
test()总结
到此这篇关于Python3中from...import...与import ...之间区别详解的文章就介绍到这了,更多相关Python3 _from...import...与import ...区别内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









