美文网首页
Python模块与包

Python模块与包

作者: JunChow520 | 来源:发表于2020-09-21 20:59 被阅读0次

模块(module)

模块module从逻辑上说是一组功能的组合,本质上一个模块就是一个包含Python定义和声明的文件,文件名是模块名字加上.py后缀。

模块可以包含可执行的语句和函数定义,这些语句的目的是为了初始化模块,它们只会在模块第一次遇到import导入语句时才会执行。import语句可以在程序中的任意位置使用,同一个模块会被import导入多次时,为了防止重复导入,在第一次导入后就将模块名加载到内存了,后续import语句仅仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句。

使用模块的好处可以大大提高代码的可维护性,其次编写代码也不必再从零开始。当一个模块编写完毕,可以被其它地方引用。使用模块还可以避免函数名和变量名冲突,相同名字的函数或变量完全可以分别存在不同的模块中。

模块导入(import)

模块搜索路径

import mod

当执行import导入模块时解释器都在做什么呢?解释器是如下路径中搜索目标模块的:

  1. 在当前执行文件所在的文件夹中查找是否存在目标模块,若不存在则搜索失败。
  2. 在系统设置的python环境变量指定的路径中搜索
  3. 在python安装时指定的目录下搜索

查看导入模块时的搜索路径

$ python3
>>> import sys
>>> sys.path
[
  '', 
  'D:\\python\\program\\python38\\python38.zip', 
  'D:\\python\\program\\python38\\DLLs', 
  'D:\\python\\program\\python38\\lib', 
  'D:\\python\\program\\python38', 
  'D:\\python\\program\\python38\\lib\\site-packages'
]

如需手工指定路径加入到模块搜索路径可使用

$ python3
>>> abspath = r"D:\\python\\module"
>>> sys.path.append(abspath)
>>> sys.path

模块导入流程

首先会找到需要导入的模块,判断当前模块是否已经被导入过,如果没有导入过则执行导入流程。

导入时先会创建一个属于当前模块的命名空间,如果用户没有定义变量来引用当前模块的内存地址的话,就会使用模块的名称来引用当前模块的内存地址。如果用户使用as来指定变量接收内存地址,接着就会将内存地址赋值给指定变量,此时在后续下文调用时只能使用指定变量进行调用,不能再使用模块名称来调用,调用后执行模块中的代码。

如果模块已经被导入过,解释器不会重新执行模块内的语句,后续import语句仅仅是对已经加载到内存中的模块对象增加一次引用。

模块导入顺序

多个模块导入时可使用逗号分隔,按照规范建议模块导入的顺序为:内置模块 > 第三方扩展模块 > 自定义模块

导入的模块与命名空间

导入的模块会重新开辟一块独立的名称空间,定义在此模块中的函数会把当前模块的命名空间当作全局命名空间,这样当前空间和模块运行空间也就分离开了,互不影响。

模块别名

模块在导入时开辟了新的空间内存,默认使用模块名称来引用新空间的内存地址,有时候模块名称会很长,执行调用模块中的功能时会显得不方便。为了更好地使用模块,可以为模块起别名。在导入模块时,为了不让模块使用默认的名字来引用内存空间,而是由自定义的变量来引用模块的内存地址。

例如:使用变量mn作为模块的别名引用module的引用内存地址

import module_name as mn

对模块指定功能的导入

from ... import

使用from...import导入模块功能时,模块已经全部加载。

绝对导入

绝对导入要给出当前模块、函数的完整路径,import语句使用点号作为分隔符来分隔包或模块。

import ecommerce.products

相对导入

在包存在的情况下如果已经知道父模块的名字可使用相对导入

from .database import Database

如何让Python文件即可以被当作模块来引用,也可以作为脚本来执行呢?

只需要在代码中添加__name__ == ' __main__'判断条件,Python解释器即可知道条件内的为脚本执行的内容。

$ vim mod.py
# coding=UTF-8

list = [100, 200, 300]
str = "hello world"


def fn(x, y):
    print('x = %s, y = %s' % (x, y))


class Klass:
    pass


if (__name__ == "__main__"):
    print(str)
    print(list)
    fn(0, 1)
    obj = Klass()
    print(obj)

模块组织(package)

Python中包package的概念在模块module之上,为了方便管理而将文件进行打包,打包目录下的第一个文件需要是__init__.py,然后是模块和子目录。如果子目录下也存在__init__.py文件则会作为当前包的子包。

引入包为了避免模块命名冲突,简单来说,Python为避免同名模块的问题,引入按文件目录来组织模块的方法,也就是包。

package包是存放在文件夹中的模块集合,包名是文件夹的名字。如果需要告知Python当前文件夹是一个Python的包,需在当前文件夹下创建名为__init__.py的文件。如果没有创建__init__.py文件,就无法从当前文件夹下导入模块。

__init__.py文件的作用

  • Python中作为包的标识不能被删掉
  • 可定义__all__用来模糊导入

相关文章

  • Python模块与包@2018-11-21

    Python模块与包 python语言中,如果希望实现代码的重用,除去使用类之外,模块与包是不错的选择。在此对模块...

  • python命名规范

    Google Python命名规范 module_name, 模块 package_name, 包 模块与包 ...

  • python 2.7 -> python 3.7 升级记录

    更换的模块 python 3.7 模块名python 2.7 模块名python 3.7 包python 2.7包...

  • Python模块与包

    Python模块与包 模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模...

  • Python中的包

    目录 什么是python的包与模块 包的身份证 如何创建包 包的倒入 模块的导入 什么是pytlhon的包 包就是...

  • 浅谈 Python 的模块导入

    浅谈 Python 的模块导入 本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句...

  • [python] python模块与包

    一个py文件就是一个模块,py文件可以放到目录结构中。如果目录结构中包含__init__.py,该目录就构成了一个...

  • python 模块与包

    先说一下搜索路径 导入一个 *.py 模块时,解释器先在当前目录中搜索名为 *.py 的文件。如果没有找到的话,接...

  • Python 模块与包

    默认路径:Lib\site-packages 模块与包的概念 1、一个.py文件就可以成为一个模块(Module)...

  • python 模块与包

网友评论

      本文标题:Python模块与包

      本文链接:https://www.haomeiwen.com/subject/crxbyktx.html