老万聊Python-模块的引用
在软件开发时,不可能不引用其它的库(开发包)或仅用一个源文件,这就需要引用其它的包或工程中的其它源文件。在python中有两种方式引入开发包,今天老万聊聊这两种方式以及之间的区别。
一、模块与import语句
一)import引入模块
importModule.py定义了全局变量、函数及类,CallModule.py对import Module模块的引用及调用见图1:
图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进行讲解
图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:
图3
原因是:from导入取消了方法(函数)在模块的查找时间2、二则命名空间不同
3、网上所说的内存使用不同(进行验证,不正确)
from…import…会在内存中创建并加载该模块工具的副本,当有另外一个程序导入时,会在内存中创建另一个副本进行加载,不会共用一个副本。所以程序进行的修改不会影响到被导入的原模块,且不同程序之间不会互相影响。
import…方法导入模块会在内存中直接加载该模块的全部属性。当出现多个程序导入该模块时,会共用一个模块,程序之间会互相影响,包括原模块。
图4进行测试,应该是错的。
图4
工程需要多动手实践!!!实践是检验真理的唯一方法。
网上已经有不少这方面的资料,老万你为什么再写一篇,老万不但让你知其然,也让你知所以然。更让你知,网上的有些东西不一定正确。