前言:遇到这个问题后,在网上查到了很好的资料。此处将网上的三篇文章总结汇总,以便日后查阅。
虽有改写,均视为转载!原文的作者和连接附在文末。若侵犯原作者权益,请联系本人删改此文!
模块:是指一个可以交互使用,或者从另一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 c
比import A.b.c
更方便,且不会冒混淆的危险.
网上还有reload和__import__()的方法,不是很常用,此处略过
效率优化
例如我们要使用os模块中的某个属性,那我们可以单独引入os中某个属性
from os import version
同样的我们也可以把引入的模块属性或者对象,直接赋给另外一个变量,使用as:
from os import version as ver
这样使用方便
如果在一个函数中频繁的使用某个模块的属性,那我们可以像上述那样,给它去一个本地变量的别名。因为频繁使用属性,而且模块是全局变量,这样消耗了多余的系统资源。
而且这样会使变量查找速度快很多。在查找全局变量之前总是会先查找本地变量,将经常用到的模块替换为一个本地变量,会使你的程序跑的快很多。并且在写代码的时候便于记忆,便于书写代码。