老万聊Python-模块的引用

在软件开发时,不可能不引用其它的库(开发包)或仅用一个源文件,这就需要引用其它的包或工程中的其它源文件。在python中有两种方式引入开发包,今天老万聊聊这两种方式以及之间的区别。

一、模块与import语句

一)import引入模块

importModule.py定义了全局变量、函数及类,CallModule.py对import Module模块的引用及调用见图1:

python引入pytz模块_命名空间


图1

首次使用import引入模块时,他将做以下3件事:

1、创建新的命名空间,并把源文件编译成字节码(.pyc)或目标码(.o),这可通过编译选项进行设置,本例为importModule.cpython-39.pyc;

2、在新的命名空间中执行模块中包含的代码;

3、在调用import引入模块时,要用模块名作为前缀,这在一定程度上避免命名的重复,避免命名重复更好的方法是包的引用。。

二)使用as限定符

1、在引入模块时可以使用as进行名称的更改。
例如 import numpy as np

该文件编译成字节码时,进行了预处理,把np任然换成numpy!!!

2、更改已导入模块的名称对于编写可扩展代码很有用,例如

file_format=’xml’
 if file_format==’xml’:
 import xmlreader as reader
 elif file_format==’csv’:
 import csvreader as reader

二、从模块中导入选定的符号

根据图2进行讲解

python引入pytz模块_命名空间_02


图2

1、from importModule import fun

在调用该模块时,仅用fun进行调用,不需要加模块名作为前缀。很容易造成命名空间的冲突(即出现重名现象,尤其是全局变量,若出现问题很难进行调试)。根据Python解释规则,以本模块的定义为首选(就近原则)。

2、如果导入一个很长的名称列表,可以将名称放在括号内,这样可以轻松的将import语句放在多行上。

例如:from importModule import (g_a,

fun,

Spam)

3、as限定符也可用于重命名使用from导入的具体对象

例如:from importModule import Spam as sp

4、from importModule import *

导入模块中所定义的全局变量、函数及类,但不包含以下划线(_)开头的定义。

from importModule import *语句只能在模块的顶层使用,不能放在函数内部(import Module import与from importModule import fun可以,参考图2)。原因在于将函数编译为内部字节码时,函数中所有的符号都需要的符号都需要明确指定,而from importModule import *没能指定具体的函数,而在顶层时它通过__all__来进行导入。

关于下划线,在python中有特殊的意义。(详细讲解请关注老万聊python)

三 import与from导入的区别

1、from导入的模块比import导入的运行速度快近1.2~1.4倍,如图3:

python引入pytz模块_python_03


图3

原因是:from导入取消了方法(函数)在模块的查找时间2、二则命名空间不同

3、网上所说的内存使用不同(进行验证,不正确)

from…import…会在内存中创建并加载该模块工具的副本,当有另外一个程序导入时,会在内存中创建另一个副本进行加载,不会共用一个副本。所以程序进行的修改不会影响到被导入的原模块,且不同程序之间不会互相影响。

import…方法导入模块会在内存中直接加载该模块的全部属性。当出现多个程序导入该模块时,会共用一个模块,程序之间会互相影响,包括原模块。

图4进行测试,应该是错的。

python引入pytz模块_命名空间_04


图4

工程需要多动手实践!!!实践是检验真理的唯一方法。

网上已经有不少这方面的资料,老万你为什么再写一篇,老万不但让你知其然,也让你知所以然。更让你知,网上的有些东西不一定正确。