Python中import机制

Python中import机制Python语言中import的使用很简单,直接使用importmodule_name语句导入即可。这里我主要写一下"import"的本质。Python官方定义:Python

大家好,又见面了,我是你们的朋友全栈君。

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”目录下。

自定义模块

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155948.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Nginx/Apache 和Apache Tomcat 的区别

    Nginx/Apache 和Apache Tomcat 的区别参考文献:https://www.kancloud.cn/hx78/java-web/335879Nginx/Apache和ApacheTomcat的区别 一、Nginx/Apache是WebServer,而ApacheTomact是一个servletcontainer想请教下,具体区别呢?因为如果使用了ApacheTomact的话已经具备响应httpreques…

    2022年6月9日
    38
  • Matlab符合矩阵微分,matlab解矩阵微分方程.pdf[通俗易懂]

    matlab解矩阵微分方程MATLAB20180625–MATLAB1Definition1t′()Definition2∫()∫24MATLABode451:–11–MATLAB⩾(1)2.14MATLAB1%RUNGEKUTTA442%hyowinn…

    2022年4月9日
    77
  • FPGA综合项目——SDRAM控制器

    FPGA综合项目——SDRAM控制器FPGA综合项目——SDRAM控制器目录整体框架串口接收模块接收模块测试仿真串口发送模块发送模块测试仿真整体框架串口接收模块接收模块测试仿真串口发送模块发送模块测试仿真

    2022年7月25日
    10
  • datax(27):不太常见配置项querySql、preSql、postSql、splitPk[通俗易懂]

    datax(27):不太常见配置项querySql、preSql、postSql、splitPk[通俗易懂]每个datax的json都有自己的json配置文档,基本大同小异,有几个配置较为少用,但是用了之后,真香~一、querySql1、使用教程描述:在有些业务场景下,where这一配置项不足以描述所筛选的条件,用户可以通过该配置型来自定义筛选SQL。当用户配置了这一项之后,DataX系统就会忽略table,column这些配置型,直接使用这个配置项的内容对数据进行筛选,例如需要进行多表join后同步数据,使用selecta,bfromtable_ajointable_bontabl.

    2022年5月16日
    467
  • fileinput基本使用[通俗易懂]

    fileinput基本使用[通俗易懂]新增$(“#attachmentsFile”).fileinput({theme:”fa”,showPreview:true,//是否显示预览hideThumbnailContent:true,//是否在缩略图中隐藏预览内容(图像,pdf内容,文本内容等)。showUpload:false,//隐藏上传按钮…

    2022年6月7日
    38
  • Tomcat问题集锦

    Tomcat问题集锦Tomcat问题集锦

    2022年4月24日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号