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_nameprint(\"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 nameprint(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_nameprint(\"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 helloprint(\"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_namedef 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 hellodef 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 import
- 导致python中import错误的原因是什么
- 解决python中import文件夹下面py文件报错问题
- Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
- python shell命令行中import多层目录下的模块操作
- Python 中的 import 机制之实现远程导入模块
- 解析Python3中的Import
- python 3.74 运行import numpy as np 报错lib\\site-packages\\numpy\\__init__.py
- 关于python导入模块import与常见的模块详解
- 解决python有时候import不了当前的包问题
- Python 动态导入对象,importlib.import_module()的使用方法