Python模块导入的两种常用方法及效率优化

前言:遇到这个问题后,在网上查到了很好的资料。此处将网上的三篇文章总结汇总,以便日后查阅。
虽有改写,均视为转载!原文的作者和连接附在文末。若侵犯原作者权益,请联系本人删改此文!

模块:是指一个可以交互使用,或者从另一Python 程序访问的代码段。

只要导入了一个模块,就可以引用它的任何公共的函数、类或属性。模块自身可以通过这种方法来使用其它模块的功能。

方法一

import modname

用import语句导入模块,就在当前的名称空间(namespace)建立了一个到该模块的引用.这种引用必须使用全称,也就是说,当使用在被导入模块中定义的函数时,必须包含模块的名字。所以不能只使用 funcname,而应该使用 modname.funcname

调用类的属性和方法:创造实例X = module_name.class_name( ,)

​ X.属性

​ X.方法()

虽然开头没有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模块,还避免了导入模块中的每个类可能引发的名称冲突。

方法二

#导入单个及多个类
from modname import funcname 
from modname import fa, fb, fc  

#导入模块中所有的类
from modname import *   

与第1种方法的区别:funcname 被直接导入到本地名字空间去了,所以它可以直接使用,而不需要加上模块名的限定* 表示,该模块的所有公共对象(public objects)都被导入到 当前的名称空间,也就是任何只要不是以”_”开始的东西都会被导入。

modname没有被定义,所以modname.funcname这种方式不起作用。并且,如果funcname如果已经被定义,它会被新版本(该导入模块中的版本)所替代。

建议:
1)如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import

2)如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import

3)如果模块包含的属性和方法与你的某个模块同名,你必须使用import module来避免名字冲突

4)尽量少用 from module import * ,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。

调用类的属性和方法: 创造实例X = class_name( ,)

​ X.属性

​ X.方法()

不推荐使用,即没有列出使用到的类,又有可能造成名称冲突。

总结:方法二:假如类名相同,将会产生覆盖类,即后输入的类有效,即使前面的类中的属性和方法比覆盖类多,也将无效。简而言之,产生覆盖后,前面的类将全部无效。不主张从一个包或模块中用import * 导入所有模块,因为这样的通常会导致可读性很差。

from Package import specific_submodule的用法并没有错,实际上这还是推荐的用法,除非导入的模块需要使用其它包中的同名子模块。综上所述,一般情况应该使用import , 但有几个例外 :1) module文档告诉你要用from-import的 ;2) 导入一个包组件。需要一个包里面的某个子模块,一般用from A.b import cimport A.b.c 更方便,且不会冒混淆的危险.

网上还有reload和_import_()的方法,不是很常用,此处略过

效率优化

例如我们要使用os模块中的某个属性,那我们可以单独引入os中某个属性

from os import version

同样的我们也可以把引入的模块属性或者对象,直接赋给另外一个变量,使用as:

from os import version as ver

这样使用方便

如果在一个函数中频繁的使用某个模块的属性,那我们可以像上述那样,给它去一个本地变量的别名。因为频繁使用属性,而且模块是全局变量,这样消耗了多余的系统资源。

而且这样会使变量查找速度快很多。在查找全局变量之前总是会先查找本地变量,将经常用到的模块替换为一个本地变量,会使你的程序跑的快很多。并且在写代码的时候便于记忆,便于书写代码。


转自:

posted @ 2017-08-10 18:32  西海岸总督  阅读(1437)  评论(0编辑  收藏  举报